Compare commits

..

1760 Commits

Author SHA1 Message Date
softwarefactory-project-zuul[bot]
896d895934 Merge pull request #10326 from chrismeyersfsu/fix-iso_path_sharing
when sharing paths use little z

AWX_ISOLATION_SHOW_PATHS will be shared between containers. Strange
file not found error can crop up when concurrently accessing shared
directories between multiple containers that are bind mounted with big
Z. So make sure we use little z.

Fixes errors like below:
fatal: [localhost]: FAILED! => {"changed": false, "cmd": "/usr/bin/git ls-remote file:///opt/tmpawx/at_DrunkMail525450112299457413919634186288881628802211907645041298254_test/ -h refs/heads/HEAD", "msg": "fatal: '/opt/tmpawx/at_DrunkMail525450112299457413919634186288881628802211907645041298254_test/' does not appear to be a git repository\\nfatal: Could not read from remote repository.\\n\\nPlease make sure you have the correct access rights\\nand the repository exists.", "rc": 128, "stderr": "fatal: '/opt/tmpawx/at_DrunkMail525450112299457413919634186288881628802211907645041298254_test/' does not appear to be a git repository\\nfatal: Could not read from remote repository.\\n\\nPlease make sure you have the correct access rights\\nand the repository exists.\\n", "stderr_lines": ["fatal: '/opt/tmpawx/at_DrunkMail525450112299457413919634186288881628802211907645041298254_test/' does not appear to be a git repository", "fatal: Could not read from remote repository.", "", "Please make sure you have the correct access rights", "and the repository exists."], "stdout": "", "stdout_lines": []}```

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-06-01 19:55:14 +00:00
Chris Meyers
067e6a5163 when sharing paths use little z
* AWX_ISOLATION_SHOW_PATHS will be shared between containers. Strange
file not found error can crop up when concurrently accessing shared
directories between multiple containers that are bind mounted with big
Z. So make sure we use little z.
2021-06-01 15:11:25 -04:00
softwarefactory-project-zuul[bot]
a286324ab7 Merge pull request #10313 from YoungjuWang/patch-1
Update README.md

SUMMARY
Guide for running docker-compose with detached mode
ISSUE TYPE


Docs Pull Request

AWX VERSION

19.1.0

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-06-01 16:16:08 +00:00
Shane McDonald
64bd49da16 Delete dependabot.yml 2021-06-01 09:19:33 -04:00
softwarefactory-project-zuul[bot]
5622bf1a0a Merge pull request #10260 from mabashian/8249-resource-name-launch
Adds resource name and description to launch and schedule prompt wizards

SUMMARY
link #8249
link #7254
Launch with description:

Launch without description:

ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Kersom <None>
Reviewed-by: Michael Abashian <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-06-01 13:14:37 +00:00
softwarefactory-project-zuul[bot]
862f40a643 Merge pull request #10320 from shanemcd/bump-19.2.0
Bump version and update for 19.2.0

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-06-01 12:59:22 +00:00
softwarefactory-project-zuul[bot]
41e3a69001 Merge pull request #10225 from AlanCoding/deletions
Remove code and settings no longer used

Connect #8740

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-06-01 12:42:32 +00:00
Shane McDonald
cabc60792b Bump version and update for 19.2.0 2021-06-01 08:18:21 -04:00
왕영주 (Youngju Wang)
eb305edafd Update README.md
How to run docker-compose with '-d' option
2021-05-31 17:49:43 +09:00
mabashian
ec78f5a9ec Add name/description to mock resources in tests 2021-05-27 16:18:03 -04:00
mabashian
d711a9aed3 Mark string for translation 2021-05-27 16:11:19 -04:00
mabashian
4836a5b1a9 Extract strings 2021-05-27 15:57:00 -04:00
softwarefactory-project-zuul[bot]
57b093aa2a Merge pull request #10294 from kdelee/clarify_help_msg
clarify format of date for host_metric

SUMMARY


@amolgautam25 @AlanCoding let me know what you think -- I was taking a second look at the CLI and took me a bit to remember the format it wants is YYYY-MM-DD

Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Amol Gautam <amol_gautam25@yahoo.co.in>
2021-05-27 19:26:48 +00:00
softwarefactory-project-zuul[bot]
fabc67eeb3 Merge pull request #10279 from mabashian/8852-checkbox-list-item
Fixes bug where users were unable to click on text next to checkboxes/radios in modals

SUMMARY
link #8852
This should impact lists in modals where the user can select one or more of the rows.  They should now be able to click on the text/row in order to select.  Examples:

ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-27 19:06:50 +00:00
softwarefactory-project-zuul[bot]
c29a7ccf8b Merge pull request #10102 from jbradberry/disable-local-users
Add the ability to disable local authentication

SUMMARY
When an external authentication system is enabled, users would like the ability to disable local authentication for enhanced security.
related #4553
TODO

 create a configure-Tower-in-Tower setting,  DISABLE_LOCAL_AUTH
 expose the setting in the settings UI
 be able to query out all local-only users

User.objects.filter(Q(profile__isnull=True) | Q(profile__ldap_dn=''), enterprise_auth__isnull=True, social_auth__isnull=True)
see: awx/main/utils/common.py, get_external_account


 write a thin wrapper around the Django model-based auth backend
 update the UI tests to include the new setting
 be able to trigger a side-effect when this setting changes
 revoke all OAuth2 tokens for users that do not have a remote
auth backend associated with them
 revoke sessions for local-only users

ultimately I did this by adding a new middleware that checks the value of this new setting and force-logouts any local-only user making a request after it is enabled


 settings API endpoint raises a validation error if there are no external users or auth sources configured

The remote user existence validation has been removed, since ultimately we can't know for sure if a sysadmin-level user will still have access to the UI.  This is being dealt with by using a confirmation modal, see below.


 add a modal asking the user to confirm that they want to turn this setting on

ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API
UI

AWX VERSION

Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Mat Wilson <mawilson@redhat.com>
Reviewed-by: Michael Abashian <None>
Reviewed-by: Chris Meyers <None>
2021-05-27 18:37:47 +00:00
mabashian
af162b6897 Use expandable section when description is longer than 512 characters to avoid making the wizard unusably long 2021-05-27 14:28:54 -04:00
softwarefactory-project-zuul[bot]
dd269804fd Merge pull request #10234 from rooftopcellist/rm_eula_acceptance
Remove explicit eula acceptance

SUMMARY
Issue: ansible/tower#4948
This PR changes the entitlement process to no require explicit acceptance of the Eula, but still display it for the user to read.
ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API
UI

AWX VERSION

19.1.0

ADDITIONAL INFO
If the eula_accepted field is passed, it will just be ignored.

Reviewed-by: Bill Nottingham <None>
2021-05-27 17:54:21 +00:00
mabashian
ad5cc3a393 Adds click event to table row to handle selecting/unselecting checkbox/radio 2021-05-27 12:23:03 -04:00
mabashian
4b4e57889e Remove unused disabled prop 2021-05-27 10:50:11 -04:00
mabashian
f4ba87ea4f Fixes bug where users were unable to click on text next to checkboxes in modals 2021-05-27 10:47:31 -04:00
mabashian
dc64da6f72 Adds resource name and description to launch and schedule prompt wizards 2021-05-27 10:45:38 -04:00
softwarefactory-project-zuul[bot]
4e129d3d04 Merge pull request #10295 from wenottingham/nope--not-there-anymore
Move irc references to point to irc.libera.chat

c.f. ansible-community/community-topics#19 (comment)

Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Matthew Jones <bsdmatburt@gmail.com>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-27 13:59:06 +00:00
softwarefactory-project-zuul[bot]
7542ebda48 Merge pull request #10293 from tchellomello/awx-doc
Redirect documentation to awx-operator docs

SUMMARY
CC: @shanemcd
Related: ansible/awx-operator#330
The PR ansible/awx-operator#330 enhances the AWX installation process via the awx-operator.
This PR redirects the installation notes to the awx-operator page so we can simplify and easy maintain the docs in one place.
ISSUE TYPE


Docs Pull Request

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-27 13:59:01 +00:00
mabashian
ff559a81db Remove eula checkbox from UI 2021-05-27 09:26:33 -04:00
Christian M. Adams
909cdc2425 Remove explicit eula acceptance 2021-05-27 09:26:32 -04:00
Bill Nottingham
8b183b5f5d Move irc references to point to irc.libera.chat
c.f. https://github.com/ansible-community/community-topics/issues/19#issuecomment-849071636
2021-05-27 00:36:30 -04:00
softwarefactory-project-zuul[bot]
da13196e59 Merge pull request #10278 from nixocio/ui_de_explanation
Update message about Default Execution Environment

Update message about Default Execution Environment
Organizations

Projects

See: #9715

Reviewed-by: Bill Nottingham <None>
Reviewed-by: Kersom <None>
2021-05-26 21:55:40 +00:00
Marcelo Moreira de Mello
d333b0080f Redirect documentation to awx-operator docs 2021-05-26 17:34:47 -04:00
Elijah DeLee
75de8a30f6 clarify format of date for host_metric 2021-05-26 17:31:11 -04:00
nixocio
3e2affb08e Update message about Default Execution Environment
Update message about Default Execution Environment

See: https://github.com/ansible/awx/issues/9715
2021-05-26 17:11:08 -04:00
softwarefactory-project-zuul[bot]
42dbd4ea73 Merge pull request #10289 from rooftopcellist/container-group-typo
The list secrets role rule is no longer not needed for container groups

SUMMARY
The list secrets role rule is no longer not needed for container groups.  This was simplified to just get the single matching secret using the read_namespaced_secret() method.

Reviewed-by: Seth Foster <None>
2021-05-26 19:18:07 +00:00
Christian M. Adams
36f47f3696 The list secrets role rule is no longer not needed for container groups 2021-05-26 14:38:56 -04:00
softwarefactory-project-zuul[bot]
c4eceb0915 Merge pull request #10180 from AlexSCorey/10162-ConvertOptionsList
Converts Options lists and other modal lists to tables

SUMMARY
This addresses #10162.  Note this issue I found while working on this #10181
Kicked Off E2E
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

AWX VERSION
ADDITIONAL INFORMATION

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-26 15:11:46 +00:00
softwarefactory-project-zuul[bot]
a8b2b5892c Merge pull request #10267 from mabashian/10138-activity-stream
Fixes bug where activity stream changes were displaying as [object object]

SUMMARY
Resolves #10138
Here it is working:

In this case the value passed to the VariablesDetail component is a straight up JSON object (not a stringified JSON object) which that component does not seem to like in its current state.
Rather than looking at changing the VariablesDetail implementation I decided to just stringify the object before it gets passed in.  Since this object is generated by the backend I think it's safe to assume it will always be an object.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-26 15:01:23 +00:00
softwarefactory-project-zuul[bot]
f0129c857b Merge pull request #10271 from beeankha/galaxy_cred_export_bug
Enable Export of Galaxy Credentials Associated to Organizations

SUMMARY

Addresses #9342

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 19.1.0

Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
2021-05-26 14:55:19 +00:00
softwarefactory-project-zuul[bot]
66789fa713 Merge pull request #10268 from wenottingham/branding-take-2
Update branding to match guidelines

SUMMARY
Name of product feature is Insights for AAP.

Reviewed-by: Michael Abashian <None>
2021-05-25 22:14:02 +00:00
softwarefactory-project-zuul[bot]
82a585dbe2 Merge pull request #10269 from nixocio/ui_migration_issue
Update migration page as per latest name changes

Update migration page as per latest name changes

  
    
    

    rename.mov
    
  

  

  


See: #8355

Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-05-25 21:44:54 +00:00
softwarefactory-project-zuul[bot]
2b4732f07b Merge pull request #10204 from rooftopcellist/container-groups-registry-creds
Container groups registry creds

SUMMARY
Fixes #10114
In VM-based installs, the user provides image pull creds to us, then we put them in an authfile and give it to podman via --authfile.
This is not so simple with ContainerGroups because we need to use the k8s API to apply a podspec to create containers in this paradigm.
Currently, the EE pod gets created, but errors when pulling the custom EE in from the private repo:

This work will modify the init() for the AWXReceptorJob class to create a k8s secret in the given namespace, then specify that secret name in the pod-spec as an imagePullSecret
Also, the imagePullPolicy was not being enforced when running JT's in EE's using container groups, this is because the imagePullPolicy nevery got set on the pod spec.
ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

devel

  
    
    

    
    

  


ADDITIONAL INFORMATION
Issues that this solves:

Image pull secret now gets created in the cluster namespace specified by the user for that container group.
imagePullSecret name gets set on the pod spec
If the pull secret already exists in the namespace, delete it, then create it.  (kube_api.replace_namespaced_secret did not work for this case...)
Enforce imagePullPolicy for EE's in container groups
Basic error handling

Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Chris Meyers <None>
2021-05-25 21:03:44 +00:00
beeankha
02cd646b44 Update awxkit to enable export of Galaxy credentials associated to organizations 2021-05-25 16:52:54 -04:00
Bill Nottingham
c9ac18db24 Update branding to match guidelines 2021-05-25 16:25:34 -04:00
nixocio
5e369dc9e2 Update migration page as per latest name changes
Update migration page as per latest name changes

See: https://github.com/ansible/awx/issues/8355
2021-05-25 16:18:00 -04:00
mabashian
e0e66e3818 Fixes bug where activity stream changes were displaying as [object object] 2021-05-25 15:23:15 -04:00
Alex Corey
0a276a6276 resolves some poor styling on some lists 2021-05-25 15:21:01 -04:00
Christian M. Adams
536c02dc55 Simplify hostname parsing 2021-05-25 15:19:40 -04:00
Christian M. Adams
d607dfd5d8 Added error handling for pull secret creation requests
- Check (only) the existing secret to see if it's value would change.
2021-05-25 14:58:01 -04:00
softwarefactory-project-zuul[bot]
d2d62adcb9 Merge pull request #10248 from AlexSCorey/updatedPF
Updates PF

SUMMARY
This is a dependency bump for PF so that I can get an update that fixes a validation bug in pf date picker.
E2E test have been triggered
ISSUE TYPE
dep bump
COMPONENT NAME

UI

AWX VERSION



ADDITIONAL INFORMATION

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-25 18:57:55 +00:00
Christian M. Adams
cea6d8c3cb Use utf-8 & properly parse hostname from registry URL 2021-05-25 14:44:42 -04:00
Christian M. Adams
8316a1d198 Create pull secret in cluster and use it in PodSpec
- base64 encode secret values before creating the secret
  - Construct valid .dockerconfigjson
  - Cancel jobs where it will obviously fail & error handling
  - Check if the secret exists first, then attempts to replace it if it does.
2021-05-25 14:44:42 -04:00
Christian M. Adams
a0840ddec2 Enforce EE pull policy on Container Groups 2021-05-25 14:44:41 -04:00
softwarefactory-project-zuul[bot]
e28bed5a6c Merge pull request #9904 from MaximilianMeister/approval-docs
Document usage of workflow job template nodes with approvals

SUMMARY

I'm not sure if this procedure is mandatory, but it was the only way it worked for me.
It's already documented in one sentence that you can create all workflow template nodes first and then link them later. However in the Examples it has been missing to make it explicit, as it's not really intuitive when you create the nodes and link them at the same time, it won't work and you run into #8777
ISSUE TYPE


Docs Pull Request

AWX VERSION

awx: 19.0.0

Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Maximilian Meister <None>
Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-05-25 17:22:08 +00:00
softwarefactory-project-zuul[bot]
25bb3fbd59 Merge pull request #10261 from shanemcd/bump-receptor
Bump receptor and receptorctl

Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Yanis Guenane <None>
2021-05-25 17:09:30 +00:00
softwarefactory-project-zuul[bot]
f2cd630a90 Merge pull request #10251 from kdelee/options_ee
tweak message about image pull option

SUMMARY

I'm not sure if it is OK to change the migration in this way.
This message in the UI didn't make sense to me. If you all prefer the existing message, that is fine...I just think it is weird and doesn't tell you what it does.
If I don't care, I can leave it on --------- in the UI which is "do whatever the default is"
If I do care, its weird to choose an option saying I don't choose and option.

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Jeff Bradberry <None>
2021-05-25 16:19:41 +00:00
Shane McDonald
63d702d1aa Bump receptor and receptorctl 2021-05-25 11:58:10 -04:00
softwarefactory-project-zuul[bot]
d6c5a23e05 Merge pull request #10239 from mabashian/disable-pendo
Only initialize pendo if the key is available

SUMMARY
Don't bootstrap/init pendo if the key is missing or empty string

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-25 12:46:51 +00:00
mabashian
dd1bda3b67 Fix broken app container test 2021-05-25 08:06:06 -04:00
mabashian
82c3348b15 Only initialize pendo if the key is available 2021-05-24 17:34:00 -04:00
Elijah DeLee
058189dfcf tweak message about image pull option 2021-05-24 17:20:53 -04:00
softwarefactory-project-zuul[bot]
e2140ad7a8 Merge pull request #10250 from tiagodread/locators-screens
Add locators to screen page titles

Adds locators around the screen title so that we can use it in e2e tests.

Reviewed-by: Kersom <None>
2021-05-24 20:30:58 +00:00
softwarefactory-project-zuul[bot]
fedc40d578 Merge pull request #10230 from amolgautam25/issue_315_receptor
Adding AWX_CONTAINER_GROUP_POD_LAUNCH_TIMEOUT in defaults.py

--- Adding a new global variable AWX_CONTAINER_GROUP_POD_LAUNCH_TIMEOUT in defaults.py
--- Passing this parameter in receptor_params in AWXReceptorJob class
SUMMARY

Related issue : ansible/receptor#315
Corresponding PR on receptor side : ansible/receptor#316
I have added a global variable AWX_CONTAINER_GROUP_POD_LAUNCH_TIMEOUT  ( and set default value as 5 minutes ).
This will be passed onto Receptor in case a job is container group task.

ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 19.1.0

ADDITIONAL INFORMATION




File Name : awx/main/tasks.py
Class Name : AWXReceptorJob
Function name: receptor_params(self)
Before the change the value of receptor_params before returning was :
{'secret_kube_config': '---\n'
                       'apiVersion: v1\n'
                       'clusters:\n'
                       '- cluster:\n'
                       '    insecure-skip-tls-verify: true\n'
                       '    server: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       '  name: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       'contexts:\n'
                       '- context:\n'
                       '    cluster: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       '    namespace: default\n'
                       '    user: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       '  name: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       'current-context: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       'kind: Config\n'
                       'preferences: {}\n'
                       'users:\n'
                       '- name: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       '  user:\n'
                       '    token: '
                       'sha256~otM0Z2vC8qfzm3eV0tfz-0V4DXKPqLC_Pp1gxXKuC-c\n',
 'secret_kube_pod': '---\n'
                    'apiVersion: v1\n'
                    'kind: Pod\n'
                    'metadata:\n'
                    '  labels:\n'
                    '    ansible-awx: 04366fdb-65ec-4efc-bb01-685e9ca7e05b\n'
                    "    ansible-awx-job-id: '21'\n"
                    '  name: automation-job-21\n'
                    '  namespace: default\n'
                    'spec:\n'
                    '  containers:\n'
                    '  - args:\n'
                    '    - ansible-runner\n'
                    '    - worker\n'
                    '    - --private-data-dir=/runner\n'
                    '    image: quay.io/ansible/awx-ee:0.2.0\n'
                    '    name: worker\n'}
>>>

After the change the value of receptor_params before returning is :
{'pod_pending_timeout': '5m',
 'secret_kube_config': '---\n'
                       'apiVersion: v1\n'
                       'clusters:\n'
                       '- cluster:\n'
                       '    insecure-skip-tls-verify: true\n'
                       '    server: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       '  name: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       'contexts:\n'
                       '- context:\n'
                       '    cluster: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       '    namespace: default\n'
                       '    user: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       '  name: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       'current-context: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       'kind: Config\n'
                       'preferences: {}\n'
                       'users:\n'
                       '- name: '
                       'https://api.tower.ocp4.testing.ansible.com:6443\n'
                       '  user:\n'
                       '    token: '
                       'sha256~otM0Z2vC8qfzm3eV0tfz-0V4DXKPqLC_Pp1gxXKuC-c\n',
 'secret_kube_pod': '---\n'
                    'apiVersion: v1\n'
                    'kind: Pod\n'
                    'metadata:\n'
                    '  labels:\n'
                    '    ansible-awx: 04366fdb-65ec-4efc-bb01-685e9ca7e05b\n'
                    "    ansible-awx-job-id: '21'\n"
                    '  name: automation-job-21\n'
                    '  namespace: default\n'
                    'spec:\n'
                    '  containers:\n'
                    '  - args:\n'
                    '    - ansible-runner\n'
                    '    - worker\n'
                    '    - --private-data-dir=/runner\n'
                    '    image: quay.io/ansible/awx-ee:0.2.0\n'
                    '    name: worker\n'}
>>>

We can see that an extra parameter has been added : 'pod_pending_timeout': '5m',
####Additional changes :
--- Removed AWX_CONTAINER_GROUP_POD_LAUNCH_RETRIES from defaults.py as it was not being used anywhere
--- Removed AWX_CONTAINER_GROUP_POD_LAUNCH_RETRY_DELAY from defaults.py as it was not being used anywhere

Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Amol Gautam <amol_gautam25@yahoo.co.in>
Reviewed-by: Seth Foster <None>
2021-05-24 20:05:52 +00:00
Tiago
aeed2e0128 add locators to screen page titles 2021-05-24 16:22:38 -03:00
fedora
0c917caa2a --- Adding AWX_CONTAINER_GROUP_POD_LAUNCH_TIMEOUT in defaults.py
--- Passing this parameter in receptor_params in AWXReceptorJob class
--- Removed AWX_CONTAINER_GROUP_POD_LAUNCH_RETRIES from defaults.py as it was not being used anywhere
--- Removed AWX_CONTAINER_GROUP_POD_LAUNCH_RETRY_DELAY from defaults.py as it was not being used anywhere
2021-05-24 11:33:01 -04:00
Alex Corey
4fe4856d02 updates patternfly react core so that we can get time picker validation bug fix 2021-05-24 10:57:50 -04:00
Alan Rominger
cb1df4a334 Remove code and settings no longer used 2021-05-24 09:44:58 -04:00
Alex Corey
c456b944a5 Converts all Lists inside a modal, mostly components that use OptionsList, to paginated tables 2021-05-24 09:08:06 -04:00
softwarefactory-project-zuul[bot]
7801590bef Merge pull request #10245 from tiagodread/add-testability
Add testability to the search and pagination fields

Add locators to search fields
See: #10241

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-05-21 17:26:27 +00:00
Tiago
d834afd541 Pagination 2021-05-21 12:40:42 -03:00
Tiago
34ac60b35c Search and AdvancedSearch 2021-05-21 12:31:55 -03:00
softwarefactory-project-zuul[bot]
b771929b6e Merge pull request #10195 from nixocio/ui_issue_9377
Fix null issue for limit

Fix null issue for limit.
See: #9377

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-05-20 21:33:48 +00:00
softwarefactory-project-zuul[bot]
a25eec5cfa Merge pull request #9654 from amolgautam25/issue_4687
Adding host_metrics for customers who don't have automation analytics

SUMMARY

I am trying to accomplish the following:

 Create a new model that stores details about hostname
 create corresponding migrations for it
 Update the table (main_hostmetrics) after playbook execution
 retrieve the data with custom awx-manage command :  awx-manage host_metrics --since <date> --until <date>


ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 18.0.0


ADDITIONAL INFORMATION

Reviewed-by: Ryan Petrello <ryan@ryanpetrello.com>
Reviewed-by: Amol Gautam <amol_gautam25@yahoo.co.in>
Reviewed-by: Chris Meyers <None>
Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Bill Nottingham <None>
Reviewed-by: Ladislav Smola <lsmola@redhat.com>
Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-05-20 13:55:46 +00:00
Alex Corey
3b5641c41b adds confirmation modal to switch 2021-05-20 09:31:31 -04:00
softwarefactory-project-zuul[bot]
68f214c2be Merge pull request #8185 from AlanCoding/sniff_files_final
Use inventory and env private_data_dir subfolders

SUMMARY
This is another part of trying to get AWX to follow ansible-runner best practices.
See docs:
https://ansible-runner.readthedocs.io/en/stable/intro.html#runner-input-directory-hierarchy
So what runner & people expect is:
.
├── env
│   ├── envvars
│   ├── extravars
│   ├── passwords
│   ├── cmdline
│   ├── settings
│   └── ssh_key
├── inventory
│   └── hosts
└── project
    ├── test.yml
    └── roles
        └── testrole
            ├── defaults
            ├── handlers
            ├── meta
            ├── README.md
            ├── tasks
            ├── tests
            └── vars

What we were producing was something more like
├── cp
├── env
│   ├── cmdline
│   ├── envvars
│   ├── extravars
│   ├── passwords
│   ├── settings
│   └── ssh_key
├── project
│   ├── ansible.cfg
│   ├── ansible_env.yml
│   ├── async_tasks.yml
<snip>
│   └── vault.yml
└── tmp3evnorsu

There was no inventory folder, and inventory was stored in tmp3evnorsu as a top-level file. Any credential files were also saved in that same structure.
With this change, it's more like:
├── cp
├── env
│   ├── cmdline
│   ├── envvars
│   ├── extravars
│   ├── passwords
│   └── settings
├── inventory
│   └── tmp94xjm0d7
└── project
    ├── ansible.cfg
    ├── ansible_env.yml
    ├── async_tasks.yml
<snip>
    └── vault.yml

and any credential files (starting with tmp) are dumped into the env folder.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

API

AWX VERSION
14.1.0

ADDITIONAL INFORMATION
The motivation for this is that ansible-runner may require specific mounts for every file of directory in the private_data_dir. As such, we really don't want randomized filenames in the top level directory. I don't know for sure this is the direction we are going to go, but this seems like a defensible change on its own, to better adhere to the practices someone familiar with ansible-runner would expect.

Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Chris Meyers <None>
2021-05-19 17:24:33 +00:00
Jeff Bradberry
2aa3fe756e Remove the remote user existence validation
since we are going to do a confirmation modal dialog instead.
2021-05-19 10:27:51 -04:00
softwarefactory-project-zuul[bot]
20dd436ee9 Merge pull request #10226 from wenottingham/one-more
Rename one more Tower bit.

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-05-19 00:59:02 +00:00
Bill Nottingham
34f4dc521b Rename one more Tower bit. 2021-05-18 19:26:18 -04:00
softwarefactory-project-zuul[bot]
7e307a69ce Merge pull request #10217 from AlexSCorey/updatelingui
Updates LingUI Again

SUMMARY
This updates ling ui to bring in their latest release so that we don't have to run npm extract-strings every time we add/update a <Plural> or a string with a variable inside it.
ISSUE TYPE
-dependency upgrade
COMPONENT NAME

UI

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-05-18 22:01:55 +00:00
softwarefactory-project-zuul[bot]
282914e809 Merge pull request #10191 from chrismeyersfsu/fix-threading_tracebacks
close db and cache connection in new threads

It's not safe to share or re-use django db connections nor django cache connections across new threads nor processes.

Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-18 19:41:58 +00:00
softwarefactory-project-zuul[bot]
7eaf1db3e0 Merge pull request #10206 from tchellomello/update_ee_via_operator
Commits settings.DEFAULT_EXECUTION_ENVIRONMENTS updates into the database

SUMMARY
Fixes: ansible/awx-operator#256
cc: @shanemcd
Cannot update execution environment version in place by updating the AWX spec via awx-operator.  For example, consider the scenario below:
spec:
  tower_ee_images:
    - image: registry.tatu.home/ansible/awx-ee:0.1.0
      name: My Custom Execution Environment

The expectation would be once you modify the AWX spec to the version below, the EE should reflect this change once the awx-operator finishes its reconciliation.
After:
spec:
  tower_ee_images:
    - image: registry.tatu.home/ansible/awx-ee:0.2.0
      name: My Custom Execution Environment

-- deployment got updated
- args:
        - receptor
        - --config
        - /etc/receptor.conf
        image: registry.tatu.home/ansible/awx-ee:0.2.0
        imagePullPolicy: IfNotPresent
        name: awx-devel-ee-ee
Besides the awx-operator updated the YAML deployment as expected, the change did not hit the database.
awx=# select * from main_executionenvironment;
 id |    created    |   modified    | description |     image      | managed_by_tower | created_by_id | credential_id | modified_by_id | organization_id |      name      | pull 
----+---------------+---------------+-------------+----------------+------------------+---------------+---------------+----------------+-----------------+----------------+------
  1 | 2021-05-11 15.| 2021-05-11 15.|             | registry.tatu..| t                |             1 |               |              1 |                 | My Custom Exec.| 
    |.:24:02.674302.|.:24:02.674327.|             |.home/ansible/a.|                  |               |               |                |                 |.ution Environm.| 
    |.+00           |.+00           |             |.wx-ee:0.1.0    |                  |               |               |                |                 |.ent            | 
(1 row)
ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

devel

ADDITIONAL INFORMATION


Quick proof of concept
>>> settings.DEFAULT_EXECUTION_ENVIRONMENTS
[{'name': 'My Custom Execution Environment', 'image': 'registry.tatu.home/ansible/awx-ee:0.2.0'}]
>>> [a.name for a in  ExecutionEnvironment.objects.all()]
['My Custom Execution Environment']
>>> [a.image for a in  ExecutionEnvironment.objects.all()]
['registry.tatu.home/ansible/awx-ee:0.2.0']

*** updating to new but keeping name 
>>> _, created = ExecutionEnvironment.objects.update_or_create(name='My Custom Execution Environment', defaults={'image': 'registry.tatu.home/ansible/awx-ee:0.3.0', 'managed_by_tower': True})
>>> [a.name for a in  ExecutionEnvironment.objects.all()]
['My Custom Execution Environment']
>>> [a.image for a in  ExecutionEnvironment.objects.all()]
['registry.tatu.home/ansible/awx-ee:0.3.0']

*** adding a new name
>>> _, created = ExecutionEnvironment.objects.update_or_create(name='My Custom Execution Environment2', defaults={'image': 'registry.tatu.home/ansible/awx-ee:0.3.0', 'managed_by_tower': True})
>>> [a.name for a in  ExecutionEnvironment.objects.all()]
['My Custom Execution Environment2', 'My Custom Execution Environment']
>>> [a.image for a in  ExecutionEnvironment.objects.all()]
['registry.tatu.home/ansible/awx-ee:0.3.0', 'registry.tatu.home/ansible/awx-ee:0.3.0']

Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-18 18:36:07 +00:00
softwarefactory-project-zuul[bot]
1b1608cff9 Merge pull request #10221 from jbradberry/check-for-pre-commit-script
Add a check for the existence of pre-commit.sh

SUMMARY
so that you don't get stuck when working on branches that don't have this yet.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API

AWX VERSION

Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-05-18 18:33:54 +00:00
fedora
cb7b2289b7 Fixed Migration 2021-05-18 14:08:42 -04:00
fedora
c1ea489043 created a new model 'HostMetrics' which will contain the first timestamp and the most recent timestamp of any automation on a given object and Added a new 'awx-manage' command. command : awx-manage host_metrics --since <datetime> --until <datetime> 2021-05-18 13:56:45 -04:00
Jeff Bradberry
c887f84a05 Add a check for the existence of pre-commit.sh
so that you don't get stuck when working on branches that don't have this yet.
2021-05-18 13:20:55 -04:00
softwarefactory-project-zuul[bot]
fb7c827bff Merge pull request #10068 from wenottingham/fail-early-fail-often
Have the project update playbook warn if role/collection syncing is disabled

In recent AWX, a galaxy credential (even a blank one for galaxy.ansible.com) is required to sync role/collection content. This is done so that server precedence can be properly set, and so that it can be configured to pull only from a private content host.
This does lead to bug reports where the credentials are not set, and users don't understand why their content is not syncing. This makes that more clear.

Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-05-18 15:29:21 +00:00
Alex Corey
5f03768f5d updates ling ui so that we do not need to run npm extract-strings as often 2021-05-18 10:53:36 -04:00
softwarefactory-project-zuul[bot]
df3bd2e082 Merge pull request #10133 from mabashian/ui-next-pendo
Adds support for pendo initialization across the app

SUMMARY
We were already bootstrapping pendo as part of the subscription code I just moved that code to a more general place.  When the app container mounts (after login or on refresh) we check to see if the pendo flag is turned on.  If it is, we initialize pendo.  If it's not then we do nothing.  If a user goes into settings and manually changes the pendo tracking setting then we trigger a hard reload of the browser tab (to take the new setting into account and either initialize or not).  This functionality existed in the old UI as well.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

Reviewed-by: Michael Abashian <None>
Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-18 14:51:07 +00:00
softwarefactory-project-zuul[bot]
3d80eb30b3 Merge pull request #10209 from beeankha/fix_integration_tests
Fix failing integration test playbooks

SUMMARY

Addressing issue #10104

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


Collections

Reviewed-by: Seth Foster <None>
Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-05-18 14:13:25 +00:00
softwarefactory-project-zuul[bot]
5ad48bda6c Merge pull request #10203 from jakemcdermott/add-default-error-boundary
Add default error boundary around screens

SUMMARY
Catch any unhandled non-async errors with an error boundary around screens. This will show a generic error message instead
of crashing the page.
The react docs decently summarize the general concept of error boundaries. The example code is informative, but there appears to be a few more edge cases that need to be dealt with. Rather than re-implement solutions for those, I decided to pull in a simple and well-tested library.
ADDITIONAL INFORMATION
before

after

Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-18 00:30:29 +00:00
softwarefactory-project-zuul[bot]
fd60105db3 Merge pull request #10005 from AlanCoding/force_on_override
Update with force option if branch_override

Addresses a reported issue where force-pushing to feature branches did not work.
Connect #9371 (comment)

Reviewed-by: Bill Nottingham <None>
2021-05-17 23:58:31 +00:00
beeankha
82807a1b20 Update ad hoc command cancel test 2021-05-17 16:46:01 -04:00
softwarefactory-project-zuul[bot]
61ae80819f Merge pull request #10212 from sarabrajsingh/bugfix/create-seperator-worker-thread-for-transmit-jobs-9952
created a TransmitterThread class to start transmit jobs within. Surr…

SUMMARY

Surfaced this bug while fixing issue #9952.
Receptor-ctl would hang trying to read from a socket pair that is never closed, when the transmit job was executed yet threw an exception. This anomaly occurred when using a k8s cluster (Openshift in our case) as the execution environment.
FYI - for now, this only applies to container groups.
We moved the transmit function to execute in its own thread, and rejoin the calling function (_run_internal) when it finishes transmitting, and bubbling up exceptions if any occurred in the thread.

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 19.1.0

ADDITIONAL INFORMATION

Steps to reproduce bug:

Create an ansible project with some files (or roles) and commit to a git repository
Purposely commit a broken symlink on any file in the project files to git
Create a credential set that authenticates to your k8s cluster in AWX
Create a container instance group that leverages the credentials from Step 3 in AWX
Create a project in AWX that leverages the ansible project/git repo from Step 1
Create a job template that leverages the AWX project from Step 4 and set your EE to the container instance group from Step 3
Execute the job from Step 5

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-17 20:16:12 +00:00
beeankha
62a9c74040 Fix failing integration test playbooks 2021-05-17 15:56:39 -04:00
softwarefactory-project-zuul[bot]
0e74f51aa3 Merge pull request #10134 from AlexSCorey/10132-RelatedGroupsCnverttoTables
converts inventory groups related groups and related hosts to tables

SUMMARY
This addresses #10132
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

ADDITIONAL INFORMATION

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-05-17 19:07:57 +00:00
softwarefactory-project-zuul[bot]
966eead93f Merge pull request #10121 from saito-hideki/issue/10104
Remove source_script from tower_inventory_source integration test

SUMMARY
source_script parameter is on longer available in the current version AWX API(#9822), so we need to remove it from the integration test of tower_inventory_source module

Fixes #10104

ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

awx_collections

AWX VERSION
devel

  
    
    

    
    

  


ADDITIONAL INFORMATION
None

Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Hideki Saito <saito@fgrep.org>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-05-17 18:46:24 +00:00
Sarabraj Singh
12cea1191e created a TransmitterThread class to start transmit jobs within. Surrounded ansible_runner.interface.run() in a try/except block to prevent the call from hanging on a socket pair that doesn't close 2021-05-17 14:35:13 -04:00
Alan Rominger
5dac46cd7d Update with force option if branch_override 2021-05-17 11:57:46 -04:00
softwarefactory-project-zuul[bot]
2c2aaa7fea Merge pull request #10182 from jakemcdermott/standardize-dependency-updates
Use development container when updating dependencies

GOAL
When adding, updating, or removing a package, the resultant changeset to the package.json and package-lock.json files that we check into devel should be consistent and reproducible, regardless of who is doing the update or what machine they're doing the update on.
SUMMARY OF CHANGES

Even though we usually run the ui development tooling outside of the awx development container, we should standardize on using this environment to update packages to ensure some consistency.
Use npm ci instead of npm install as the default package installation command, since we generally want to modify package files only when updating deps
You can run into memory limits from docker or node when building in the container, so increase the node memory limit and add a note to the docs that you may need to increase the container memory limit in your docker-for-mac settings (or similar tool, if you use it)

Reviewed-by: Kersom <None>
Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-17 15:22:16 +00:00
Marcelo Moreira de Mello
997525076d update_or_create EE via settings.DEFAULT_EXECUTION_ENVIRONMENTS 2021-05-17 00:41:06 -04:00
softwarefactory-project-zuul[bot]
3b280e1b32 Merge pull request #10205 from jbradberry/favicon-fix
Add an nginx location directive for the favicon

SUMMARY
Add an nginx location directive for the favicon so that the rewrite rule that adds slashes to the ends of requested
urls doesn't get to it.
related #8618
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API
UI

AWX VERSION

Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-05-14 19:25:35 +00:00
softwarefactory-project-zuul[bot]
a8b6db3967 Merge pull request #10179 from nixocio/ui_issue_9126_2
Update login message to avoid duplicate brand name

Returned brandName already contain the name brand Ansible. Update to
avoid name brand repetition.
Also update brandName on document title.
See: #9126

Reviewed-by: Kersom <None>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-14 19:04:36 +00:00
Jeff Bradberry
bcf93810ad Add an nginx location directive for the favicon
so that the rewrite rule that adds slashes to the ends of requested
urls doesn't get to it.
2021-05-14 14:00:57 -04:00
Hideki Saito
0cb33bd278 Remove source_script from tower_inventory_source integration test
* Fixes #10104

Signed-off-by: Hideki Saito <saito@fgrep.org>
2021-05-15 00:18:37 +09:00
Jake McDermott
8c2ca29f4e Add default error boundary around screens
Catch any unhandled non-async errors with an error boundary
around screens. This will show a generic error message instead
of crashing the page.
2021-05-14 10:40:48 -04:00
softwarefactory-project-zuul[bot]
f1767d05b0 Merge pull request #10202 from tiagodread/3420-fix
Use non-root path links

Resolves ansible/tower#3420
Use non-root path for links

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-05-14 13:44:45 +00:00
softwarefactory-project-zuul[bot]
b1cd7eb997 Merge pull request #9988 from mabashian/9163-admin-approvals-page
Fixes bug where workflow approvals page would crash if deleted username was referenced

SUMMARY
link #9163
The tooltip on the status labels for completed workflow approvals attempts to show the username of the user that acted on it.  If that user has been deleted then the key is not present in the object.  This would cause the page to crash.
To fix this, I conditionally show a different string when the username is not available.  If a user wants to see which deleted user acted on the approval they'll have to go to the activity stream.

ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Mat Wilson <mawilson@redhat.com>
2021-05-14 13:17:37 +00:00
Tiago
0f8533f123 use non-root path 2021-05-14 10:00:18 -03:00
softwarefactory-project-zuul[bot]
2191ab1c6c Merge pull request #10148 from keithjgrant/8907-launch-prompt-vars-validation
Add Variables field validation in launch prompt

SUMMARY

Adds validation for the Variables field during launch prompts.
Prevents unexpected expanding of YAML expressions in the default value (similar to #7506) — this was caused by the default value being parsed into a JavaScript object and then re-translated back to YAML when mounting the "Other Prompts" step

addresses #8907
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-13 21:01:09 +00:00
mabashian
9975d4764d Extract strings 2021-05-13 16:38:41 -04:00
mabashian
31907423ce Fixes bug where workflow approvals page would crash if deleted username was referenced 2021-05-13 16:37:04 -04:00
nixocio
94d46a6e96 Fix null issue for limit
Fix null issue for limit.

See: https://github.com/ansible/awx/issues/9377
2021-05-13 14:26:18 -04:00
Jeff Bradberry
6f4c41a8d3 Add validation checks
that prevent the setting from being turned on if remote auth systems
and users are not already present.
2021-05-13 13:57:33 -04:00
Jeff Bradberry
81de931711 Add a new middleware to force-logout local-only users
when the DISABLE_LOCAL_AUTH setting is set.  This avoids the ugliness
of getting a SuspiciousOperation error for any request/response cycles
that are in flight when a user gets bounced.
2021-05-13 13:55:44 -04:00
Jeff Bradberry
9e7f004ca6 Add a signal handler to invalidate sessions and tokens for local users
when this setting gets turned on.
2021-05-13 13:55:44 -04:00
Jeff Bradberry
5c664eadf9 Write a thin wrapper around the standard Django auth backend 2021-05-13 13:55:44 -04:00
Jeff Bradberry
26b7e9de40 Add a new setting, DISABLE_LOCAL_AUTH
and expose it in the settings UI.
2021-05-13 13:55:44 -04:00
softwarefactory-project-zuul[bot]
09801d0a9a Merge pull request #10159 from AlanCoding/inventory_ig
Add instance_group to inventory update serializer

SUMMARY
Inventory updates run remotely, in the execution plane. This adds the instance_group field to the inventory update serializer to help clarify this reality.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

API

Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-13 17:50:45 +00:00
softwarefactory-project-zuul[bot]
a332f46f31 Merge pull request #10171 from jakemcdermott/remove-job-isolated-settings
Remove all AWX_ISOLATED* fields

I believe this should address #10123. The issue mentions a worker-json.js 404 and, while we should fix that at some point, I don't think it's actually related to the save not working.
SUMMARY
I noticed the job settings form wasn't saving on devel.
After some debugging, I found that removing the AWX_ISOLATED_CHECK_INTERVAL and AWX_ISOLATED_LAUNCH_TIMEOUT made the form saveable again.
It doesn't seem like we use any of the AWX_ISOLATED* fields anymore (not to be confused with AWX_ISOLATION* fields, which we do use) so this PR removes them all.
cc @wenottingham @shanemcd @marshmalien  @gamuniz @tiagodread @jbradberry

Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Bill Nottingham <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-13 17:32:15 +00:00
Jake McDermott
6f6d9e2f15 Update dependency update examples
There's no need to make a production build when updating dependencies,
just reiinstall
2021-05-13 13:09:30 -04:00
Jake McDermott
cd7c85490b Handle and document potential memory limit issues
* Increase node memory limit
* Add note to docs that you may need to increase container memory thresholds
imposed by docker-for-mac and similar tools if you're using them
2021-05-13 12:55:37 -04:00
Jake McDermott
a9ec7038de Use npm ci as default package installation command
We don't want to generate new package.json and package-lock.json
files unless we're explicitly updating new dependencies.
2021-05-13 12:55:28 -04:00
Jake McDermott
795e3c84fc Use development container when updating dependencies 2021-05-13 12:55:22 -04:00
softwarefactory-project-zuul[bot]
f2b2e64426 Merge pull request #10190 from jbradberry/fix-precommit-for-macs
Remove the shebang line from pre-commit.sh

SUMMARY

since bash isn't available by default on OS X.

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION



  
    
    

    
    

  


ADDITIONAL INFORMATION

Reviewed-by: Kersom <None>
Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
2021-05-13 15:24:24 +00:00
Chris Meyers
9b7bc5109a close db and cache connection in new threads 2021-05-13 11:13:26 -04:00
Jeff Bradberry
d07887bd91 Remove the shebang line from pre-commit.sh
since bash isn't available by default on OS X.
2021-05-13 10:49:24 -04:00
softwarefactory-project-zuul[bot]
bb47bdbc43 Merge pull request #10185 from jakemcdermott/fix-10170
Drop the word 'name' from image field, add examples

for #10170
We call this field "Image" in other places, so we want it to match. Also, "Image name" can be confusing because people may think they just need to provide the image name instead of the full image location, which includes registry and tag version.
cc @gamuniz @nixocio @beeankha @tiagodread

Reviewed-by: Kersom <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Julen Landa Alustiza <None>
2021-05-13 14:44:38 +00:00
softwarefactory-project-zuul[bot]
d477f04d75 Merge pull request #10175 from AlanCoding/only_have_eyes_for_you
Add more fields to .only since they get referenced

SUMMARY
Fixes a performance bottleneck when saving playbook_on_stats for jobs that use --limit against a small number of hosts while it has a large number in the inventory.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API

ADDITIONAL INFORMATION
'tis the problem with .only(), that only the developer who wrote the queryset remembers that the other fields cannot be referenced except at the cost of another query
https://github.com/ansible/awx/pull/7352/files

Reviewed-by: Chris Meyers <None>
Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-05-13 14:44:33 +00:00
Alan Rominger
e5f059806b Add instance_group to inventory update serializer 2021-05-13 09:00:43 -04:00
Alan Rominger
6649b435ce Fix flake8 error 2021-05-13 08:57:19 -04:00
Alan Rominger
ae320ab228 Do not set openstack env var to blank string 2021-05-13 08:57:19 -04:00
Alan Rominger
29c961e52a Remove comment 2021-05-13 08:57:19 -04:00
Alan Rominger
fd466c5cff Finish converting the runner strings 2021-05-13 08:57:19 -04:00
Alan Rominger
623cf0b4cd Start migrating the /runner path references 2021-05-13 08:57:18 -04:00
Alan Rominger
d33a748eea Clean up and test patch changing methods 2021-05-13 08:57:18 -04:00
Alan Rominger
1f1cdf8859 start on path helper methods 2021-05-13 08:57:18 -04:00
Alan Rominger
334be9eb25 Use durable switch from container to host path 2021-05-13 08:57:18 -04:00
Alan Rominger
8f9373085a Fix credential env folder, test_tasks.py 2021-05-13 08:57:18 -04:00
Alan Rominger
11c5d577d6 Fix rel path for other inventories 2021-05-13 08:57:17 -04:00
Alan Rominger
0e17023ba3 Inventory directory already pre-created 2021-05-13 08:57:17 -04:00
Alan Rominger
3c785fbff3 update unit tests to new behavior 2021-05-13 08:57:16 -04:00
Alan Rominger
0061c57577 update inventory injector tests 2021-05-13 08:56:38 -04:00
Alan Rominger
f59da78328 Use inventory and env private_data_dir subfolders
This avoids writing files to the top level
  of the ansible-runner private_data_dir

Inventory is moved to be in the standard "inventory" folder

Credential related files are moved inside of the "env" folder

Also pre-create these folders when preparing for a job run

With this, args is the only top-level file still remaining
2021-05-13 08:56:38 -04:00
softwarefactory-project-zuul[bot]
117bb07f0d Merge pull request #10187 from jakemcdermott/warn-and-recompile-lint
Warn but still recompile on lint error

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Keith Grant <keithjgrant@gmail.com>
2021-05-12 21:32:55 +00:00
softwarefactory-project-zuul[bot]
01fdc482be Merge pull request #10169 from jakemcdermott/fix-10127
Always resolve launching status

SUMMARY
Resolves #10127
Always resolve the launching status after any intermediate async activity that needs to occur while loading prompts, etc.

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-12 21:31:35 +00:00
softwarefactory-project-zuul[bot]
875abcd31a Merge pull request #10161 from nixocio/ui_issue_10144
Display error for boolean fields

Display error when modifying Allow Override Branch on Projects.
See: #10144

Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Kersom <None>
2021-05-12 21:30:09 +00:00
Jake McDermott
3468153619 Warn but still recompile on lint error 2021-05-12 16:47:49 -04:00
softwarefactory-project-zuul[bot]
27b1d15a7a Merge pull request #10063 from nixocio/ui_issue_7777_style
Add slider to adjust capacity_adjustment

Add slider to adjust capacity adjustment.
Also add a new custom hook, useDebounce.

See: #7777

Reviewed-by: Kersom <None>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-12 20:17:28 +00:00
Jake McDermott
39ce0ade6d Update image descriptions, add examples 2021-05-12 16:10:42 -04:00
nixocio
dfb0710d69 Add slider to adjust capacity_adjustment
Add slider to adjust capacity adjustment.

Also add a new custom hook, useDebounce.

See: https://github.com/ansible/awx/issues/7777
2021-05-12 15:42:31 -04:00
nixocio
f6c9621510 Display error for boolean fields
Display error when modifying Allow Override Branch on Projects.

See: https://github.com/ansible/awx/issues/10144
2021-05-12 14:49:16 -04:00
softwarefactory-project-zuul[bot]
7f90a8b2b3 Merge pull request #10183 from beeankha/null_ee_show_error
Show Error if No Execution Environment is Found on Project Sync or Job Run

SUMMARY

Duplicate of PR #10147 fixing issue #10118

Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-12 18:47:50 +00:00
mabashian
0d17dfcd87 Pass config request through to subscription edit 2021-05-12 14:47:07 -04:00
mabashian
91134b2537 Remove erroneouos extra param 2021-05-12 14:47:06 -04:00
mabashian
3a56d2447c Adds support for pendo initialization across the app 2021-05-12 14:47:06 -04:00
softwarefactory-project-zuul[bot]
550a66553e Merge pull request #10113 from AlexSCorey/10045-ProjectListIssues
Adds Job Cancel Button

SUMMARY
This addresses part of #10045 and adds a sync cancel button on the projects list.  It also expands the usage of that button to the Project details page, and the Inventory Source list.  It does this by introducing a new component called JobCancelButton, that basically takes the work of the job cancel button on the Output toolbar and refactors it slightly to make it useable in these other areas.  This button could also be used in the Inventory Source details page once we have websockets hooked up for that view and we can track the status of the sync. (#9013)
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

ADDITIONAL INFORMATION

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Kersom <None>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-12 18:27:06 +00:00
Jake McDermott
7fbe01352f Drop the word name from image field input
This field is labeled as just "Image" in other places, so we want
it to match. Also, "name" can be confusing because users will think
they just need to provide the image name instead of the full image
location, which includes registry and tag version.
2021-05-12 14:26:18 -04:00
beeankha
3520a6e066 Update fixtures on unit tests 2021-05-12 14:00:04 -04:00
beeankha
19d7f3e346 Update unit tests 2021-05-12 13:56:46 -04:00
softwarefactory-project-zuul[bot]
71f9476a51 Merge pull request #9759 from ghjm/idempotence_is_a_thing
Make tower_license module idempotent

SUMMARY
Currently, the tower_license module always installs a license, without checking if Tower is already licensed.  In general, Ansible modules are supposed to be idempotent.  This PR updates the module to check whether Tower is already licensed, and do nothing in that case.  A new parameter force is provided so the user can always install the license, or override an existing license with a new one.
ISSUE TYPE
Bughancement
COMPONENT NAME
awx_collection
AWX VERSION
awx: 18.0.0
(but really Tower 3.8.2)

Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Graham Mainwaring <graham@mhn.org>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-05-12 17:44:47 +00:00
Tiago
ffcf76ddd0 update ouiaId 2021-05-12 14:41:10 -03:00
softwarefactory-project-zuul[bot]
d36babf506 Merge pull request #10145 from nixocio/ui_issue_8788
Allow modify scm branch override

Source Control Branch was not being displayed as part of the
JobTemplate Edit, since the project did not have the variable
allow_override as part of the summary_fields.


Add source control details for JobDetail and WorkflowJobTemplateDetail


See: #8788

Reviewed-by: Kersom <None>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Mat Wilson <mawilson@redhat.com>
2021-05-12 17:37:14 +00:00
softwarefactory-project-zuul[bot]
a73cb0280c Merge pull request #10184 from jbradberry/explicit-pre-commit-script
Break out the pre-commit hook into an explicit script

SUMMARY

This means that

we don't have to be always updating the underlying .git/hooks/pre-commit file
updates to the logic will just work automatically
the logic of the conditional invocation of black has been fixed so that AWX_IGNORE_BLACK=1 should work correctly now


ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION



  
    
    

    
    

  


ADDITIONAL INFORMATION

Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Jeff Bradberry <None>
2021-05-12 16:37:27 +00:00
Jeff Bradberry
1e5a0dc7c5 Break out the pre-commit hook into an explicit script
This means that

- we don't have to be always updating the underlying .git/hooks/pre-commit file
- updates to the logic will just work automatically
- the logic of the black logic has been fixed so that AWX_IGNORE_BLACK=1 should work right now
2021-05-12 11:54:17 -04:00
beeankha
fd5f3a82d2 Show error if no Execution Environment is found on project sync/job run 2021-05-12 11:52:12 -04:00
softwarefactory-project-zuul[bot]
e970620672 Merge pull request #10174 from jbradberry/remove-isolated-instances
Data migration to remove the isolated instances from the database

SUMMARY


ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API

AWX VERSION



  
    
    
  


ADDITIONAL INFORMATION

Reviewed-by: Elyézer Rezende <None>
Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-05-12 14:27:03 +00:00
nixocio
1befacaf39 Update login message to avoid duplicate brand name
Returned brandName already contain the name brand Ansible. Update to
avoid name brand repetition.

See: https://github.com/ansible/awx/issues/9126
2021-05-12 08:44:28 -04:00
softwarefactory-project-zuul[bot]
e9bf25f108 Merge pull request #10176 from shanemcd/bye-docker
Use base image from quay.io/centos/centos

Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-05-11 21:04:25 +00:00
Alex Corey
6c06b0432b adds job cancel button to job detail page and to job list 2021-05-11 16:35:08 -04:00
softwarefactory-project-zuul[bot]
a7c50b77ea Merge pull request #10048 from wenottingham/analyze-that
Update analytics branding

SUMMARY
cc @kyleabenson @benthomasson
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API
UI

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-11 20:28:24 +00:00
Alan Rominger
164255e516 Remove fields not needed from .only 2021-05-11 16:26:12 -04:00
softwarefactory-project-zuul[bot]
74282c5dfb Merge pull request #10173 from nixocio/ui_issue_10078
Display Edit/Delete on EE details page as per last API changes

Display Edit/Delete buttons on details page for EE managed by tower.
See: #10078

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-11 20:25:31 +00:00
Shane McDonald
afa3501194 Use base image from quay.io/centos/centos 2021-05-11 16:24:59 -04:00
Alan Rominger
0f5629b514 Add more fields to .only since they get referenced 2021-05-11 16:14:55 -04:00
Tiago
0db58f0edd update ouiaId 2021-05-11 16:02:39 -04:00
Alex Corey
7f022b1555 adds job cancel button to job detail page 2021-05-11 16:02:39 -04:00
Alex Corey
9f80f918c5 allows canceling of all jobs on job output page 2021-05-11 16:01:52 -04:00
Alex Corey
34fe255336 disables delete button on project details page 2021-05-11 16:00:55 -04:00
Alex Corey
03265c05ca fixes setstate, and double tooltip 2021-05-11 16:00:55 -04:00
Alex Corey
6c7e1fc4eb Adds Job Cancel Button
This refactors the cancel button on the job output page so that it can be used on the Project List page,
the Project detail page, and the Inventory Source list page. Once websockets are ready for the Inventory Source details page
and we can track the status of the source we can use this button there too.
2021-05-11 16:00:55 -04:00
Bill Nottingham
8683872927 Update analytics branding 2021-05-11 15:46:56 -04:00
Jeff Bradberry
7b47d7e7f6 Data migration to remove the isolated instances from the database 2021-05-11 15:46:39 -04:00
softwarefactory-project-zuul[bot]
19d000e97f Merge pull request #10157 from AlanCoding/minikube_docs
minikube instructions adjustments from debugging

SUMMARY
The awx-operator examples expect the tower_image_version as a separate var, and can error without that.
Also, there's still an issue getting going with ansible/deploy-operator.yml's Deploy Operator task. I'm still looking into that, the associated hack might change.
ISSUE TYPE

Docs Pull Request

COMPONENT NAME

API

AWX VERSION
19.1.0

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-11 19:00:02 +00:00
nixocio
8f54627ea6 Display Edit/Delete on EE details page as per last API changes
Display Edit/Delete buttons on details page for EE managed by tower.

See: https://github.com/ansible/awx/issues/10078
2021-05-11 13:39:07 -04:00
Jake McDermott
6bb8fd3fd6 Remove all AWX_ISOLATED* fields 2021-05-11 13:21:18 -04:00
Jake McDermott
6e97020eae Always resolve launching status 2021-05-11 12:14:53 -04:00
softwarefactory-project-zuul[bot]
30997b30b6 Merge pull request #10168 from nixocio/ui_fix_typos
Fix typos

Fix typos
I had to run npm run extract-strings since the typos were present on the Plural component.

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
2021-05-11 14:17:42 +00:00
nixocio
499321cdf7 Fix typos
Fix typos
2021-05-11 09:30:40 -04:00
softwarefactory-project-zuul[bot]
a581e26414 Merge pull request #10163 from nixocio/ui_remove_dupe
Remove duplicated API calls unit-test

Remove duplicated API calls unit-test

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-05-10 21:18:28 +00:00
nixocio
26b1a82164 Remove duplicated API calls unit-test
Remove duplicated API calls unit-test
2021-05-10 16:03:47 -04:00
softwarefactory-project-zuul[bot]
f5cc927a15 Merge pull request #10086 from jakemcdermott/fix-9370
Avoid prop reference error when recreating survey

SUMMARY
For #9370
The survey object is undefined when recreating a survey after deleting it. Add optional chaining on survey fields to avoid prop reference error.

Reviewed-by: Kersom <None>
2021-05-10 15:34:36 +00:00
Alan Rominger
7ec0464072 minikube instructions adjustments from debugging 2021-05-10 11:30:14 -04:00
Jake McDermott
b94a9c19e7 Avoid prop reference error when recreating survey
The survey object is undefined when recreating a survey after deleting it.
Add optional chaining on survey fields to avoid prop reference error.
2021-05-10 10:39:04 -04:00
softwarefactory-project-zuul[bot]
1c73407edf Merge pull request #10150 from QiYuTechDev/devel
`console.warning` is not exists on browser

SUMMARY

fix typo error for console.warn

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


UI

AWX VERSION

19.1.0

ADDITIONAL INFORMATION

console.warning is not exists function in browser envirment.

Reviewed-by: Kersom <None>
2021-05-10 13:51:56 +00:00
奇遇科技
a4d15b20ff console.warning is not exists on browser
fix typo error for `console.warn`
2021-05-10 02:49:25 +00:00
Keith J. Grant
83b6a91623 validate variables field in launch prompt 2021-05-07 16:13:38 -07:00
nixocio
5fb9afc9f5 Allow modify scm branch override
* Source Control Branch was not being displayed as part of the
JobTemplate Edit, since the project did not have the variable
`allow_override` as part of the summary_fields.

* Add source control details for JobDetail and WorkflowJobTemplateDetail

See: https://github.com/ansible/awx/issues/8788
2021-05-07 15:34:34 -04:00
softwarefactory-project-zuul[bot]
82af78fe33 Merge pull request #10131 from AlexSCorey/10088-ConverTeamsSubTabstoTables
Converts Teams Roles tab to tables

SUMMARY
Addresses #10088.  Converts The Roles tab inside of Teams to tables view.
E2E workflows triggered
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

ADDITIONAL INFORMATION

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-07 18:10:19 +00:00
softwarefactory-project-zuul[bot]
d60014987f Merge pull request #9924 from AlexSCorey/6464-SurveyMultipleChoiceRedesign
Redesign survey multiple choice 

SUMMARY
Addresses #6464.
This new design improves UI and reduces the risk to having mismatching choices and default values.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

AWX VERSION
ADDITIONAL INFORMATION

Reviewed-by: Kersom <None>
Reviewed-by: Marliana Lara <marliana.lara@gmail.com>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Sarah Akus <sarah.akus@gmail.com>
2021-05-07 17:37:23 +00:00
softwarefactory-project-zuul[bot]
55b8dcdd8d Merge pull request #10097 from sean-m-sullivan/devel
add custom_venv for backward compatibility

SUMMARY
As per #10055 , this is the proposal to add back custom virtual environments to the modules. With the understanding that they will not be tested. But to allow users of Ansible Tower 3.8 the ability to use newer features and bugfixes in awx.awx as applicable, without restorting to backporting these removals. Would expect these to remain for a time after Tower moves to Execution environments as teams/companies adopt the next version of tower.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

awx_collection

AWX VERSION
19.1.0

Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-05-07 17:19:24 +00:00
softwarefactory-project-zuul[bot]
03261c4782 Merge pull request #10141 from nixocio/ui_fix_prop_typo
Fix prop typo

Fix prop typo.
See: https://www.patternfly.org/2020.04/documentation/react/components/select#props

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
2021-05-07 17:05:09 +00:00
Alex Corey
a6778604e1 updates strings 2021-05-07 12:53:51 -04:00
Alex Corey
c441d6cd55 adds ouiaId and blank target for tooltip 2021-05-07 12:51:33 -04:00
Alex Corey
eebcab610e allows for resetting the values in edit mode 2021-05-07 12:51:33 -04:00
Alex Corey
783a0963ff moves and renames new field component. adresses console errors, removes unneeded props adds back isVaid prop on formfield 2021-05-07 12:51:33 -04:00
Alex Corey
dbc235cfb6 updates strings 2021-05-07 12:51:33 -04:00
Alex Corey
9dde854baa This puts the formatted default and choice values on the formik object.
When we go to submit the form to the api we format it again in a way
the api will recognize.  Allowing formik to manage updating, the choices
and the default values this way cleans up the code and removes a bunch of unnecessary
splitting and joining of the choices an default choices strings
2021-05-07 12:50:31 -04:00
Alex Corey
98375a0328 Adds styling, and dynamic rendering of extra fields 2021-05-07 12:48:26 -04:00
Alex Corey
264b13f33c can write in inputs properly 2021-05-07 12:48:26 -04:00
Alex Corey
35a9e7e565 some refactoring, and checking and unchecking boxes 2021-05-07 12:48:26 -04:00
Alex Corey
e088c7385a adding and removing inputs properly 2021-05-07 12:48:26 -04:00
softwarefactory-project-zuul[bot]
372c80ee44 Merge pull request #10140 from AlexSCorey/boldifyUsersSubListsName
Adds bold to some list items 

SUMMARY
Some list items were not bolded during conversion to tables mistakenly
kicked off E2E tests
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

AWX VERSION
ADDITIONAL INFORMATION

Reviewed-by: Kersom <None>
2021-05-07 15:27:34 +00:00
Alex Corey
5a1810e191 fxes pagination and removes console warnings 2021-05-07 11:26:50 -04:00
nixocio
dee0b61bc2 Fix prop typo
Fix prop typo.

See: https://www.patternfly.org/2020.04/documentation/react/components/select#props
2021-05-07 11:13:07 -04:00
Alex Corey
2c82d32720 Adds bold to some list items that were missed during conversion to tables 2021-05-07 10:14:24 -04:00
sean-m-ssullivan
715aead961 add custom_venv for backward compatibility 2021-05-07 09:01:35 -05:00
softwarefactory-project-zuul[bot]
ddb1d12a79 Merge pull request #10019 from mabashian/9635-cred-bugs
Fixes for a couple of credential form bugs

SUMMARY
link #9635
This addresses the first and second bullet points in the linked issue.  The third is actually covered by a separate PR.
The ace editor fix was to simply wrap it in a div and apply the previous styling to that div instead of the editor.
The secret key/details page crashing was caused by a race condition when would redirect back to the details view after editing.  The details view was rendering with some stale data and a key that was expected to be there was not.  To fix this I wrapped the request to fetch the credential detail in a useRequest hook and show the loading spinner while this request is outstanding.  Only after the request resolves do we try to render the details view so that it always has the up to date object.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-06 21:49:55 +00:00
Alex Corey
8fe437380d converts inventory groups related groups and related hosts to tables 2021-05-06 16:32:12 -04:00
softwarefactory-project-zuul[bot]
2d81143c98 Merge pull request #10066 from tiagodread/ouia-ids
Add testability for e2e tests

Resolves #9511
Resolves #9503
Resolves #9512

Reviewed-by: Kersom <None>
2021-05-06 20:15:49 +00:00
softwarefactory-project-zuul[bot]
a219e27e0b Merge pull request #10116 from nixocio/ui_issue_9126
Update Login page

Update Login page.

See: #9126

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-06 20:15:45 +00:00
Tiago
d428a540a0 ouiaId to AddDropDownButton ToolbarAddButton TemplateList InventoryList
add testability to DataListToolbar.jsx

add testability to AssociateModal.jsx HostGroupsList.jsx

fix lint

add ouiaId to InventoryGroupHostList.jsx

add ouiaId to ExecutionEnvironmentList.jsx

add ouiaId to InstanceGroupList.jsx

add ouiaId to InstanceGroupDetails.jsx

add ouiaId to ScheduleList.jsx and ContainerGroupDetails.jsx
2021-05-06 16:29:52 -03:00
Alex Corey
e1b6e1509c Converts Teams Roles tab to tables 2021-05-06 12:00:02 -04:00
softwarefactory-project-zuul[bot]
1d6579e110 Merge pull request #10106 from rooftopcellist/compose-opts-order
Docker-compose requires the options to be passed before up

SUMMARY
The $(COMPOSE_UP_OPTS) in the docker-compose make target need to come before the up command or else they are not parsed correctly.
ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

19.0.0

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-05-05 19:20:34 +00:00
nixocio
c50bd8d6e6 Update Login page
Update Login page.

See: https://github.com/ansible/awx/issues/9126
2021-05-05 14:10:28 -04:00
softwarefactory-project-zuul[bot]
13e1fc9839 Merge pull request #10100 from Spredzy/rename-job
Rename awx to automation for pod names

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-05 12:28:50 +00:00
Christian M. Adams
a205ddeed6 Docker-compose requires the options to be passed before up 2021-05-04 16:54:16 -04:00
softwarefactory-project-zuul[bot]
d7742d7340 Merge pull request #10044 from AlexSCorey/9977-ScheduleSurvey
Properly adds survey default values on Schedules

SUMMARY
This addresses #9977. This also fixes a bug where the extra_data was not rendering properly in schedule details
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-04 19:43:18 +00:00
softwarefactory-project-zuul[bot]
ce675319b7 Merge pull request #10105 from nixocio/ui_update_date_tooltip
Make date consistent on tooltip display

Make date consistent on tooltip to display info about job.
There are 3 places that define similar function on the code basis. Make
them consistent in how to display date.
Search for generateLastJobTooltip on code basis.

Reviewed-by: Keith Grant <keithjgrant@gmail.com>
2021-05-04 19:19:21 +00:00
Alex Corey
610138caeb Properly adds survey default values on Schedules 2021-05-04 14:56:19 -04:00
softwarefactory-project-zuul[bot]
25137b40d3 Merge pull request #10040 from keithjgrant/6189-misc-tables
Convert Inventory sub-lists to tables

SUMMARY
Converts Inventory Access, Hosts, Groups, and Sources lists to tables
Addresses #6189
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

Reviewed-by: Kersom <None>
Reviewed-by: Marliana Lara <marliana.lara@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-04 18:40:53 +00:00
mabashian
9b92d1584d Run prettier 2021-05-04 14:21:36 -04:00
mabashian
11d024abdb Adds missing code after rebase 2021-05-04 14:16:13 -04:00
mabashian
57433a59d7 Fix bug where changing credential field from plugin to string crashed application 2021-05-04 14:14:13 -04:00
mabashian
5ac4a9aca6 Fix bug with credential plugin code editor width 2021-05-04 14:09:39 -04:00
nixocio
5b92c9e8f3 Make date consistent on tooltip display
Make date consistent on tooltip to display info about job.
There are 3 places that define similar function on the code basis. Make
them consistent in how to display date.
2021-05-04 13:51:08 -04:00
Tiago
7951c2f014 change testability locator 2021-05-04 14:26:55 -03:00
Tiago
2cfdf08500 add testability 2021-05-04 14:00:24 -03:00
softwarefactory-project-zuul[bot]
10474cd64c Merge pull request #10077 from sean-m-sullivan/job_launch_tags
Fix tower_job_launch tags being passed to API

SUMMARY
#10008
Fix tower_job_launch tags being passed to API
Previously the wrong field was being used on the api to pass tags, also while the module accepts lists, the API does not, so it would error. Take a users list, and converts to comma separated string, in order to maintain status quo.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

awx_collection

AWX VERSION
19.1.0

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-05-04 16:13:16 +00:00
softwarefactory-project-zuul[bot]
da9a075000 Merge pull request #10047 from sean-m-sullivan/org_label
add org search to labels

SUMMARY
After having an issue with labels I saw that orgs were referenced, Remembering #7567 implemented the code to do the search for orgs so you can search for labels within an org, Tests include creating the same named label in two orgs, and the search not erroring out that it found two labels of that name.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

awx_collection

AWX VERSION
19.0.0

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
2021-05-04 15:55:51 +00:00
Tiago
510a546d8c add testability 2021-05-04 11:00:48 -03:00
Yanis Guenane
562f78e53d Rename awx to automation for pod names 2021-05-04 14:17:45 +02:00
softwarefactory-project-zuul[bot]
e08590290c Merge pull request #10094 from jladdjr/awx_8853_add_notification_error_to_nt_listview
add notification error to notification template list view

In support of #8853
Updates /api/v2/notification_templates to include the error field for summary_fields -> recent_notifications

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-05-04 04:21:52 +00:00
Keith J. Grant
e2c8519b77 convert InventoryHostGroups list to table 2021-05-03 16:00:09 -07:00
softwarefactory-project-zuul[bot]
86b683a8f1 Merge pull request #10096 from shanemcd/devel
Fix CSP error on Safari

This was causing:
[Error] Refused to execute a script because its hash, its nonce, or
'unsafe-inline' does not appear in the script-src directive of the Content
Security Policy. (migrations_notran, line 16)

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-05-03 21:46:04 +00:00
Shane McDonald
1ad561c307 Fix CSP error on Safari
This was causing:

```
[Error] Refused to execute a script because its hash, its nonce, or
'unsafe-inline' does not appear in the script-src directive of the Content
Security Policy. (migrations_notran, line 16)
```
2021-05-03 17:12:30 -04:00
Keith Grant
7b60733da0 delete comment
Co-authored-by: Marliana Lara <marliana.lara@gmail.com>
2021-05-03 13:53:57 -07:00
Keith Grant
d7ce328046 fix id string
Co-authored-by: Marliana Lara <marliana.lara@gmail.com>
2021-05-03 13:53:57 -07:00
Keith J. Grant
25a4a112b3 remove unecessary i18n wrappers; fix HostToggle tooltip 2021-05-03 13:53:57 -07:00
Keith J. Grant
cbe2a78287 convert inventory source list to tables 2021-05-03 13:53:57 -07:00
Keith J. Grant
83ceacf588 convert inventory groups list to tables 2021-05-03 13:53:57 -07:00
Keith J. Grant
fe0ad30245 fix inventory access/hosts lists tests 2021-05-03 13:53:57 -07:00
Keith J. Grant
0ac6ba9c99 convert inventory access/hosts lists to tables 2021-05-03 13:53:57 -07:00
softwarefactory-project-zuul[bot]
f8ecdbf287 Merge pull request #10056 from keithjgrant/6189-user-sublist-tables
Convert user sub-lists to tables

SUMMARY
Converts User Organizations, Teams, and Roles lists to tables
Addresses #6189
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-03 20:20:11 +00:00
Jim Ladd
a6f3817488 verify notification errors included in NT list view 2021-05-03 13:17:34 -07:00
Jim Ladd
e4eb03259b include error field in notification template's list of recent notifs 2021-05-03 13:17:34 -07:00
softwarefactory-project-zuul[bot]
0ccc93a166 Merge pull request #10089 from jbradberry/fix-get-default-ee
Fix projects to use the utility function get_default_execution_environment

SUMMARY


ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION



ADDITIONAL INFORMATION

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-03 19:47:53 +00:00
Keith J. Grant
2672c2ffe3 add default ouia-id to paginated tables 2021-05-03 12:04:33 -07:00
Jeff Bradberry
204083fcdc Fix projects to use the utility function get_default_execution_environment 2021-05-03 14:00:19 -04:00
Keith J. Grant
b21db2fd31 fix user list sorting issues; clean up comments 2021-05-03 10:57:17 -07:00
Keith J. Grant
d1cb0781ce update tests for new user sub-list tables 2021-05-03 10:57:17 -07:00
Keith J. Grant
7c86edd825 convert user sub-lists to tables 2021-05-03 10:57:17 -07:00
softwarefactory-project-zuul[bot]
3addbeab4c Merge pull request #10085 from jbradberry/fix-check-migrations
Make the check_migrations command a direct alias of makemigration

SUMMARY
Make the check_migrations command a direct alias of makemigration.
It already more or less was, but it previously did some machinations
around copying and modifying the database settings.  These on-the-fly
changes to the database connection no longer work after the
rearrangement of settings files, so let's just get rid of it.
Example, from running make test:
  py3: commands succeeded
  congratulations :)
awx-manage check_migrations --dry-run --check  -n 'missing_migration_file'
Traceback (most recent call last):
  File "/var/lib/awx/venv/awx/lib64/python3.8/site-packages/django/db/backends/base/base.py", line 217, in ensure_connection
    self.connect()
  File "/var/lib/awx/venv/awx/lib64/python3.8/site-packages/django/db/backends/base/base.py", line 195, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/var/lib/awx/venv/awx/lib64/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 194, in get_new_connection
    conn = Database.connect(**conn_params)
sqlite3.OperationalError: unable to open database file

ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API

AWX VERSION
awx: 19.1.0

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-03 15:45:40 +00:00
softwarefactory-project-zuul[bot]
5096f1459d Merge pull request #10059 from AlexSCorey/RemoveI18nStuff
Removes remaining I18n props, HOCs and misc objects

SUMMARY
This Removes withI18n, the i18n object and all the places that it is passed around as a prop, or argument.
E2E Tests have been triggered.  There should be no functional or visual impact. E2E results
ISSUE TYPE
-Dependency Upgrade
COMPONENT NAME

UI

AWX VERSION



ADDITIONAL INFORMATION

Reviewed-by: Kersom <None>
Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-03 15:24:50 +00:00
softwarefactory-project-zuul[bot]
a3de251732 Merge pull request #10084 from jbradberry/revert-managed-by-tower-ee-lock
Revert the code that prevents sysadmins from changing managed EEs

SUMMARY
related #10078
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API

AWX VERSION
awx: 19.1.0

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-05-03 15:13:09 +00:00
Jeff Bradberry
686d750ad9 Make the check_migrations command a direct alias of makemigration
It already more or less was, but it previously did some machinations
around copying and modifying the database settings.  These on-the-fly
changes to the database connection no longer work after the
rearrangement of settings files, so let's just get rid of it.
2021-05-03 11:01:52 -04:00
Jeff Bradberry
39f26fe576 Revert the code that prevents sysadmins from changing managed EEs
ref #10078
2021-05-03 10:25:18 -04:00
Alex Corey
7a9bcc1e1e Removes remaining I18n props, HOCs and mics objects 2021-05-03 10:10:40 -04:00
softwarefactory-project-zuul[bot]
72a940bef1 Merge pull request #10081 from nixocio/ui_fix_style_warning
Fix unit-test styling warning

Fix unit-test styling warning.
      Warning: Unsupported style property white-space. Did you mean
      whiteSpace?

Style still valid after change:

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
2021-05-03 13:54:14 +00:00
softwarefactory-project-zuul[bot]
cb26087c2a Merge pull request #9931 from seiwailai/issue-9872-sync-feedback
project: Add last job status as for project sync feedback feature.

SUMMARY
Fixes #9872

Add last job status as for the project sync feedback feature. When users clicked the sync button on the project page, last job status will eventually update the status to Pending, Waiting, Running, and final result (Successful, Cancelled, Failed, Error). The implementation requires the WebSocket connection to ensure synchronous status update.
In particular, the last job status is similar to the functionality of status in the project list (status in ProjectListItem.jsx). More specifically, the last job status accompanied by a job link that allowing the user to navigate to the job output page. Besides, there is also the tooltip that allowing the user to view the information related to the most recent sync, covering information like JOB ID, STATUS, FINISHED.
The rationale of having the last job status instead of redirection or toast notification is that:

User has choices on whether to redirect to the job output. If the user wishes to navigate to job output, he/she can click the link. Besides, the user might have other projects to be synced right after the current project and he/she may want to proceed back to the project list page instead of the job output page. If we implement force redirection, it would take a longer time to navigate to the project list page.
The status update on last job status is fundamentally similar to toast notification where the user can immediately be notified if he/she already clicked the sync button to launch the job.

Nevertheless, this PR requires further discussion. Any comments are welcomed!

ISSUE TYPE


Feature Pull Request

COMPONENT NAME


UI


awx/ui_next/src/screens/Project/Project.jsx
awx/ui_next/src/screens/Project/useWsProject.js - Added websocket implementation
awx/ui_next/src/screens/Project/ProjectDetail/ProjectDetail.jsx

AWX VERSION

awx: 19.0.0

ADDITIONAL INFORMATION

In case if users spam the sync button, we will need to ensure the fluent UI on the most recent sync tooltip and last job status. Thus, we would not want to update our last job status to Pending if there is a current running job.
For instance, we clicked sync for a particular project twice.

For the first sync, our last job status should immediately change to Pending, then Waiting, then Running, then result (which are Successful, Failed, Error, Cancelled).
For the second sync, if we have a running job, we should not update our UI to Pending, otherwise our most recent sync tooltip UI will lose our current running job and we cannot navigate to the job link through the link provided by last job status tooltip.

Issue of sync button click spam
Ideally, we should prevent any spamming on the sync button using backend logic to reduce overload on the server as we already have a similar running project. Together with backend logic, we can disable the sync button right after we start to sync a project.
However, if we only disable sync through the frontend, this seems insecure as people with bad intentions might able to change the button disable attribute.

After

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Sei Wai Lai <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-05-03 13:28:40 +00:00
softwarefactory-project-zuul[bot]
7d6a8adb79 Merge pull request #10067 from mabashian/test-warning-cleanup-3
Unit test warning cleanup

SUMMARY
These commits target the warnings that look like:
Can't perform a React state update on an unmounted component
The underlying problem here is that we have network requests that are being made by components that are subsequently being unmounted.  When the network request resolves, we attempt to update some state but the component is no longer mounted and the warning is triggered.  To address this I consolidated a lot of isMounted code into a single hook which can be used across the app to check to see whether the component in question is still mounted before attempting to update state inside of a useEffect.  This primarily applies to network requests.
I think this points to a larger issue which is that we sometimes mount components prematurely.  For example, when the job template edit component is mounted we actually mount:

JobTemplateForm (briefly)
ContentLoading
JobTemplateForm

Network requests triggered by the first mount of JobTemplateForm are suscepitble to attempting to update state on an unmounted component.  I believe this pattern exists in many places across the app but I haven't tried to solve this in this PR.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Marliana Lara <marliana.lara@gmail.com>
Reviewed-by: Kersom <None>
2021-05-03 13:22:35 +00:00
nixocio
c1e0def013 Fix unit-test styling warning
Fix unit-test styling warning.

```console.error
      Warning: Unsupported style property white-space. Did you mean
      whiteSpace?
```
2021-05-03 09:22:18 -04:00
sean-m-ssullivan
5993db76d3 fix job launch inputs 2021-05-01 23:08:44 -05:00
Shane McDonald
929ed3e09d Merge pull request #10074 from shanemcd/bump-19.1.0
Bump changelog and version files for 19.1.0
2021-05-01 07:56:47 -04:00
Shane McDonald
f83a005038 Bump changelog and version files for 19.1.0 2021-05-01 07:43:01 -04:00
Bill Nottingham
c0afd67432 Have the project update playbook warn if role/collection syncing is disabled.
Make it more clear that a credential is required.
2021-04-30 16:06:00 -04:00
mabashian
5b71681494 Fixes test warnings where state updates were being triggered after component unmounts 2021-04-30 15:34:39 -04:00
mabashian
f63312c811 Prevent multi credential state updates from happening after unmount 2021-04-30 15:34:39 -04:00
seiwailai
0886414c72 ProjectList: Change job status UI update logic.
1. Render current job status if there is current waiting, pending or running job.\n 2. Render last job status if there is no current job.
2021-05-01 03:30:16 +08:00
seiwailai
30d78e8857 Project: Added project last job status UI with websocket feature
1. Activate web socket once get into project detail page to ensure job status update synchronization.\n 2. Show last job status if there is no current job.\n 3. Show current job status if there is any current pending, waiting or running job.
2021-05-01 03:30:16 +08:00
seiwailai
07d01c49c0 ProjectListItem: Disabled sync button and render tooltip on sync.
Added feature of disabling sync button when users click sync button and rendering tooltip when disabled sync button on hover.
2021-05-01 03:30:16 +08:00
seiwailai
bb896c0b02 ProjectSyncButton: Add tests.
Add 'disable button and set onClick to undefined on sync' and 'should render tooltip on sync'
2021-05-01 03:30:16 +08:00
seiwailai
95634bf0b8 useWsProject: Add tests for useWsProject.jsx.
Add tests like 'should return project detail', 'should establish websocket connection' and 'should update project status'.
2021-05-01 03:30:16 +08:00
seiwailai
e6735b595c project: Add disable sync button feature.
Disable sync button if there is any pending, waiting or running job
2021-05-01 03:30:16 +08:00
seiwailai
03d8987d93 project: Add last job status as for feedback feature. 2021-05-01 03:30:16 +08:00
softwarefactory-project-zuul[bot]
f5c176701b Merge pull request #10031 from wenottingham/whats-in-a-name--mostly-just-letters
Assorted renaming and string changes

SUMMARY
Goal was to hit user-facing strings and docs.
Didn't try and catch all comments, although did a few when in those files.

Reviewed-by: Bill Nottingham <None>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
2021-04-30 19:24:28 +00:00
Bill Nottingham
8a4bffcd50 Fix UI tests 2021-04-30 14:32:05 -04:00
Bill Nottingham
c8cf28f266 Assorted renaming and string changes 2021-04-30 14:32:05 -04:00
softwarefactory-project-zuul[bot]
e0d6b138b0 Merge pull request #10062 from shanemcd/fix-ee-cg
A couple EE bug fixes

See commit messages for more info

Reviewed-by: Seth Foster <None>
Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-04-30 17:10:23 +00:00
Shane McDonald
f94db36273 Forcibly ensure that the correct ansible-runner command is used for CG pods 2021-04-30 12:34:26 -04:00
Shane McDonald
77c573d64a Fix bug where incorrect EE was being used for Container Group pods 2021-04-30 12:21:03 -04:00
Shane McDonald
0badc2fff7 Explicitly set args for container group pods
A user may try to use an EE that does not have the custom entrypoint script used
by the default AWX EE
2021-04-30 12:16:52 -04:00
sean-m-ssullivan
666e9c5c2f add search label by org 2021-04-29 16:14:09 -05:00
softwarefactory-project-zuul[bot]
43d33281a5 Merge pull request #10004 from AlexSCorey/9864-AddEEtoAdHocWizard
Adds an execution environment step to the ad hoc commands

SUMMARY
This addresses some of #9864 by adding a step to select an execution environment to the ad hoc commands wizard
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

AWX VERSION
ADDITIONAL INFORMATION

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-29 20:43:55 +00:00
softwarefactory-project-zuul[bot]
6bea5dd294 Merge pull request #9957 from jbradberry/isolated-removal
Isolated removal

SUMMARY
Removal of the isolated nodes feature.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

API

AWX VERSION

Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Elyézer Rezende <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-29 19:15:43 +00:00
Alex Corey
1d442452b0 adds advanced search functionality and lists correct EEs 2021-04-29 14:23:28 -04:00
softwarefactory-project-zuul[bot]
ed259cf0aa Merge pull request #10036 from seiwailai/issue-10029-project-list-cols-misaligned
ProjectList: Fixes columns misalignment.

Fixes #10029.
SUMMARY


ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


UI - ProjectList.jsx

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-29 14:39:24 +00:00
Maximilian Meister
d57f2ab496 Document usage of workflow job template nodes with approvals
Fixes #8777
2021-04-29 10:56:57 +02:00
softwarefactory-project-zuul[bot]
ba7b55bfe3 Merge pull request #10041 from mabashian/test-warning-cleanup-2
Unit test warning cleanup

SUMMARY
Cleans up warnings thrown on several unit tests
COMPONENT NAME

UI

Reviewed-by: Kersom <None>
2021-04-28 19:15:28 +00:00
softwarefactory-project-zuul[bot]
64efc2c006 Merge pull request #10037 from nixocio/ui_fix_warning
Fix a few unit-tests warnings

Fix a few unit-test warnings

Reviewed-by: Michael Abashian <None>
2021-04-28 19:14:45 +00:00
softwarefactory-project-zuul[bot]
028c48c409 Merge pull request #10042 from AlanCoding/old_docs
Remove inventory-related docs which are outdated or wrong

SUMMARY
Around 10% of this is updating docs for #9822
The rest of it is updating for changes that took place long ago, but docs still has stuff which is now wrong.
ISSUE TYPE

Docs Pull Request

COMPONENT NAME

API

Reviewed-by: Chris Meyers <None>
2021-04-28 18:56:23 +00:00
Alan Rominger
ee68dd00aa Remove inventory-related docs which are outdated or wrong 2021-04-28 14:00:05 -04:00
mabashian
6f7d594d0f Fix linting errors 2021-04-28 12:59:54 -04:00
mabashian
cc5a73aeb9 Fixes React does not recognize the ouiaId prop on a DOM element warning in NotificationTemplateList test 2021-04-28 12:59:54 -04:00
mabashian
04ca1cb1a3 Fixes Invalid prop credential.id of type number supplied to CredentialEdit, expected object warning in CredentialEdit test 2021-04-28 12:59:54 -04:00
mabashian
94b9892a1b Fixes bug with workflow form test throwing warning about Failed prop type: The prop value.name is marked as required in OrganizationLookup, but its value is undefined 2021-04-28 12:59:54 -04:00
mabashian
61f0edc5e8 Fix Each child in a list should have a unique "key" prop warnings in unit tests 2021-04-28 12:59:54 -04:00
softwarefactory-project-zuul[bot]
24a903142a Merge pull request #10035 from sean-m-sullivan/survey_idempotent
Make Workflow Surveys Idempotent

SUMMARY
Update the Workflow survey check to be in line with job template check.
Resolving issue #7554
Found that it was returning json/status_code, and needed to reference json output.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME
awx_collection
AWX VERSION
19.0.0

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-28 15:56:06 +00:00
nixocio
1471945b9e Fix a few unit-tests warnings
Fix a few unit-test warnings
2021-04-28 10:29:28 -04:00
seiwailai
58147f8bc1 ProjectList: Fixes columns misalignment.
Fixes #10029.
2021-04-28 22:21:00 +08:00
softwarefactory-project-zuul[bot]
cd6e8969d5 Merge pull request #10034 from akus062381/add-locators-template-list-jsx
add ouiaId to toolbar delete button

In working on fixing a broken e2e test, I discovered an element that needed a better locator in order to allow testability.

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-28 13:48:14 +00:00
sean-m-ssullivan
c22c0a393c update tests and survey change status 2021-04-27 19:32:21 -05:00
akus062381
efd9e22adc fixed failing test 2021-04-27 16:53:35 -04:00
softwarefactory-project-zuul[bot]
acb6e3e6e9 Merge pull request #10032 from nixocio/ui_update_timeout
Bump timeout for unit-tests

Bump timeout for unit-tests.

Reviewed-by: Michael Abashian <None>
2021-04-27 20:17:42 +00:00
softwarefactory-project-zuul[bot]
31c35fd473 Merge pull request #10033 from mabashian/test-warning-cleanup-1
Fix warning thrown about CodeDetail rows prop

SUMMARY
Warning:
  ● Console

    console.error
      Warning: Invalid argument supplied to oneOfType, expected an instance of array.

      61 |   dataCy: string,
      62 |   helpText: string,
    > 63 |   rows: oneOfType(number, string),
         |         ^
      64 |   mode: oneOf(['javascript', 'yaml', 'jinja2']).isRequired,
      65 | };
      66 | CodeDetail.defaultProps = {

      at printWarning (node_modules/prop-types/factoryWithTypeCheckers.js:23:15)
      at createUnionTypeChecker (node_modules/prop-types/factoryWithTypeCheckers.js:365:47)
      at Object.<anonymous> (src/components/DetailList/CodeDetail.jsx:63:9)
      at Object.<anonymous> (src/screens/Setting/shared/SettingDetail.jsx:5:1)

Reviewed-by: Kersom <None>
2021-04-27 20:01:21 +00:00
softwarefactory-project-zuul[bot]
881ea1295f Merge pull request #10025 from shanemcd/better-errors
Improve error handling / display when Ansible Runner errors

Before you would see unhelpful error messages like:
Traceback (most recent call last):
  File "/var/lib/awx/venv/awx/lib64/python3.8/site-packages/awx/main/tasks.py", line 1397, in run
    res = receptor_job.run()
  File "/var/lib/awx/venv/awx/lib64/python3.8/site-packages/awx/main/tasks.py", line 2957, in run
    return self._run_internal(receptor_ctl)
  File "/var/lib/awx/venv/awx/lib64/python3.8/site-packages/awx/main/tasks.py", line 3008, in _run_internal
    raise RuntimeError(detail)
RuntimeError: exit status 0

Now you will see the underlying error:
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/ansible_runner/streaming.py", line 108, in run
    utils.unstream_dir(zip_data, self.private_data_dir)
  File "/usr/local/lib/python3.8/site-packages/ansible_runner/utils.py", line 104, in unstream_dir
    data = base64.b85decode(data)
  File "/usr/lib64/python3.8/base64.py", line 463, in b85decode
    raise ValueError('bad base85 character at position %d'
ValueError: bad base85 character at position 121

Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-27 19:40:51 +00:00
mabashian
86aad8b910 Fix warning thrown about CodeDetail rows prop 2021-04-27 15:26:59 -04:00
Shane McDonald
8374b41e21 Improve error handling / display when Ansible Runner errors 2021-04-27 14:20:27 -04:00
nixocio
f9dc5cd32b Bump timeout for unit-tests
Bump timeout for unit-tests.
2021-04-27 14:15:08 -04:00
akus062381
b2497a84ad small change 2021-04-27 14:11:57 -04:00
akus062381
315018b274 small fix 2021-04-27 13:17:49 -04:00
akus062381
033adcb8b8 fixed locators 2021-04-27 13:13:50 -04:00
softwarefactory-project-zuul[bot]
54d50e2459 Merge pull request #10000 from sean-m-sullivan/project_update_fix
Fix project update

SUMMARY
Fixing bug found in #8686
Found that the on change was not triggering due to no actual changes in the Post, Set so when project update is set to true, that the wait for update is Always triggered. Also added logic from project_update to set changed status depending on if refspec changes.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

awx_collection

AWX VERSION
19.0.0

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: John Westcott IV <None>
Reviewed-by: Sean Sullivan <None>
Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-04-27 16:53:01 +00:00
softwarefactory-project-zuul[bot]
cca3698d19 Merge pull request #9965 from mabashian/8835-team-permissions
Hide teams option when adding access role to a team

SUMMARY
link #8835
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-27 14:34:09 +00:00
softwarefactory-project-zuul[bot]
bf892443df Merge pull request #10003 from jbradberry/analytics-4-week-logging
Log adjustments made to the analytics interval due to the 4-week limit

SUMMARY
If the user passes in the since and/or until parameters, sometimes they will be truncated to limit the data to only 4 weeks.  Emit a log message when this happens.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API

AWX VERSION

Reviewed-by: Jim Ladd <None>
Reviewed-by: Chris Meyers <None>
Reviewed-by: Jeff Bradberry <None>
2021-04-27 13:55:56 +00:00
softwarefactory-project-zuul[bot]
35e778b7ae Merge pull request #9960 from mabashian/9955-cred-bool
Fixes bug where credential form checkboxes were erroneously checked

SUMMARY
link #9955
A couple of things going on here.

Updating initialValues.inputs was also modifying credential.inputs because initialValues.inputs was originally a reference to credential.inputs.  I changed this so that initialValues.inputs now starts off as a clone of credential.inputs.
https://github.com/ansible/awx/compare/devel...mabashian:9955-cred-bool?expand=1#diff-db8df3eaf3e3b3117f845786dea77451fba53e9d6a3f49ae367a26137039fc35L256 <- this line was erroneously evaluating to false when the value of an input was false.  We actually just want to make sure the key exists in the object before dropping in to this block.  This is what actually fixes the bug.  Before this change we would fall in to https://github.com/ansible/awx/compare/devel...mabashian:9955-cred-bool?expand=1#diff-db8df3eaf3e3b3117f845786dea77451fba53e9d6a3f49ae367a26137039fc35R268 where the checkbox value would be erroneously set.

ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-27 13:49:14 +00:00
softwarefactory-project-zuul[bot]
5c03fa9e84 Merge pull request #9435 from nixocio/ui_issue_9433
Fix misalignment checkbox final build

Fix misalignment checkbox final build on Organization Lookup.
See: #9433

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-27 13:16:40 +00:00
nixocio
2b5fe0e6c4 Fix misalignment checkbox final build
Fix misalignment checkbox final build on Organization Lookup.

See: https://github.com/ansible/awx/issues/9433
2021-04-26 21:43:57 -04:00
softwarefactory-project-zuul[bot]
7095e266a5 Merge pull request #10024 from rooftopcellist/build_awx_docs
Add docs for building and using custom awx image

SUMMARY
Docs for how to build and push a custom AWX image to be used by the awx-operator.
ISSUE TYPE


Docs Pull Request

AWX VERSION

19.0.0

Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-04-27 01:43:34 +00:00
sean-m-ssullivan
a75cbe683c project update fix 2021-04-26 16:17:02 -05:00
Jeff Bradberry
584fda5178 Add some unit tests around the analytics interval calculations 2021-04-26 16:21:25 -04:00
Christian M. Adams
191a25cccc Add docs for building and using custom awx image 2021-04-26 15:50:57 -04:00
softwarefactory-project-zuul[bot]
6267b264bf Merge pull request #9998 from nixocio/ui_update_pf
Update patternfly packages

Update patternfly packages

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-26 18:42:13 +00:00
Alex Corey
e6bde23aea Adds an execution environment step to the ad hoc commands 2021-04-26 14:02:36 -04:00
Jeff Bradberry
4857c5edcb Break out the main interval trimming calculation into a new function 2021-04-26 13:31:05 -04:00
Jeff Bradberry
f4d848e596 Log adjustments made to the analytics interval due to the 4-week limit 2021-04-26 13:31:05 -04:00
softwarefactory-project-zuul[bot]
1e7b7d1a30 Merge pull request #10021 from AlanCoding/black_upgrade
Modify formatting in response to black update

This seems to have changed sometime between versions 20.8b1 and 21.4b0

Reviewed-by: Seth Foster <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-26 15:42:20 +00:00
Alan Rominger
67f7998ab9 Modify formatting in response to black update 2021-04-26 10:51:27 -04:00
softwarefactory-project-zuul[bot]
0bdd873bd3 Merge pull request #9896 from sean-m-sullivan/approval_node
Add workflow approval and node wait modules

SUMMARY
Please see #9878 this is a clean PR after redoing my fork.
Add a module to find a workflow approval node and approve or deny it, based on Issue #8013.
Add a module to wait for a specific workflow node to complete and return information on it.
Both of these are based on tests I have been creating for testing workflows.
Scenario
Launch workflow
Wait for A node in the workflow to finish, compare output to expected output.
If it matches, approve the approval node, otherwise deny the approval node.
Workflow completes.
Even used in concert I've added the wait feature to both of these so a user can wait on either to appear.
This does require a workflow to use unique names on the job nodes they are waiting on, As the job # is created on the fly, it would be difficult for user to specify, A future update could explore searching for a specific identifier among a workflow template and then finding that job created by that identifier.
Currently without the modules this depends on generous use of the uri module, with until and retry coupled together.
ISSUE TYPE
Feature Pull Request

COMPONENT NAME
awx-collection
AWX VERSION
19.0.0

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-24 22:52:50 +00:00
softwarefactory-project-zuul[bot]
cf51dc5cea Merge pull request #9895 from sean-m-sullivan/workflow_schema
Tower workflow schema

SUMMARY
See #9309 This is a clean PR of that, after an errant rebase
Adds a way to add entire workflow node schemas to workflows. Either through the workflow schema module or the workflow job template module.
This speeds up workflow creation vs the workflow node module by 3x.
The model for the schemas is the format used by the tower_export module.
The main difference between this and the workflow node module is that the loops are done in python. Traditionally if you have a workflow with 10 nodes, ansible tasks need to be invoked 19 times. 1x to create the workflow, 10 x to initially create the nodes, and then one time for each node that is not an endpoint in the schema. This removes the need to loop and invoke many times.
ISSUE TYPE
Feature Pull Request

COMPONENT NAME
awx-collection
AWX VERSION
17.0.1

Reviewed-by: John Westcott IV <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-23 22:00:34 +00:00
softwarefactory-project-zuul[bot]
c29fda0385 Merge pull request #10013 from shanemcd/bump-runner-and-ee
Upgrade Ansible Runner and AWX EE

Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-04-23 19:20:06 +00:00
softwarefactory-project-zuul[bot]
203f5763ad Merge pull request #10011 from beeankha/remove_custom_source_option
Remove 'custom' as a Source Option from inventory_source Module

These changes are related to PR #9822

Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-04-23 19:03:29 +00:00
Shane McDonald
0cbfd1129f Update to AWX EE 0.2.0 2021-04-23 14:32:42 -04:00
Shane McDonald
208bde6215 Update to Runner 2.0.0 alpha 2 2021-04-23 14:32:30 -04:00
beeankha
ac42604aa7 Remove 'custom' as a source option from inventory_source module 2021-04-23 13:31:42 -04:00
softwarefactory-project-zuul[bot]
a744f0d30f Merge pull request #9897 from AlexSCorey/9891-Plural
Properly tags Plural-able strings for translation, and removes unnecessary i18n

SUMMARY
This resolves #9891.
It also begings the process of remove i18n._(t string) in places in favor of this syntax
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

AWX VERSION



ADDITIONAL INFORMATION

Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Kersom <None>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-23 17:12:04 +00:00
softwarefactory-project-zuul[bot]
555b25321e Merge pull request #9982 from jladdjr/jladd_explain_setting_gather_no_matter_what_devel
[devel] add clarifying comment re: AUTOMATION_ANALYTICS_LAST_GATHER being set regardless

(the comment in the changeset pretty much says it all)

Reviewed-by: Chris Meyers <None>
2021-04-23 17:07:13 +00:00
sean-m-ssullivan
ec312358e2 fix completeness 2021-04-23 11:57:24 -05:00
softwarefactory-project-zuul[bot]
fa02fd8563 Merge pull request #9995 from mabashian/7670-delete-workflow-survey
Fixes bug deleting the last workflow survey question

SUMMARY
link #7670

ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-23 16:54:28 +00:00
softwarefactory-project-zuul[bot]
eb648d9447 Merge pull request #10002 from shanemcd/goodbye-binaries
Stop installing kubectl/oc

Realized this when looking at #9428

Reviewed-by: Chris Meyers <None>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-04-23 16:43:01 +00:00
Alex Corey
2143b60ebf remove snapshots 2021-04-23 12:34:40 -04:00
Alex Corey
4acae40d4a fixes spelling error 2021-04-23 12:31:39 -04:00
Alex Corey
71500a6554 Properly tags Plural-able strings for translation, and removes unnecessary i18n 2021-04-23 12:31:38 -04:00
softwarefactory-project-zuul[bot]
8e579b2e74 Merge pull request #9996 from AlexSCorey/RemoveSnapShots
Removes Snapshot tests

SUMMARY
Removes snapshot tests
ISSUE TYPE
COMPONENT NAME

UI

AWX VERSION



ADDITIONAL INFORMATION

Reviewed-by: Michael Abashian <None>
2021-04-23 15:08:29 +00:00
softwarefactory-project-zuul[bot]
78195a4203 Merge pull request #9999 from shanemcd/password-policies
Allow users to set password policies via AUTH_PASSWORD_VALIDATORS

Reviewed-by: Elyézer Rezende <None>
2021-04-23 14:45:21 +00:00
Shane McDonald
146fb720db Stop installing kubectl/oc
These are no longer needed with Container Groups v2 under Receptor
2021-04-23 09:15:15 -04:00
softwarefactory-project-zuul[bot]
9fd2c5ba16 Merge pull request #9993 from chrismeyersfsu/fix-gather_analytics_first_time_run
fix running analytics for the first time

related to #9992

Reviewed-by: Jeff Bradberry <None>
2021-04-23 12:09:43 +00:00
Shane McDonald
27c15caddd Allow users to set password policies via AUTH_PASSWORD_VALIDATORS 2021-04-22 18:13:36 -04:00
Jake McDermott
a7fe519063 Update patternfly packages 2021-04-22 17:00:26 -04:00
softwarefactory-project-zuul[bot]
8d20add2d5 Merge pull request #9943 from AlexSCorey/9115-SSOFix
Fixes SSO Redirect

SUMMARY
This fixes #9115 by simply checking if there is a redirect url in and then replacing it with the existing url in history, navigating the user to the correct login url.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

AWX VERSION
ADDITIONAL INFORMATION

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
2021-04-22 20:47:52 +00:00
Alex Corey
4d339fe275 Removes Snapshot tests 2021-04-22 16:44:54 -04:00
mabashian
9bfbf8d556 Fixes bug deleting the last workflow survey question 2021-04-22 16:30:47 -04:00
softwarefactory-project-zuul[bot]
bcbf0bac8c Merge pull request #9994 from pabelanger/devel
Add bindep.txt file for execution environments

This will be used by ansible-builder, for people creating EEs.
Signed-off-by: Paul Belanger pabelanger@redhat.com

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-22 20:06:30 +00:00
Alex Corey
c64fec0d98 Fixes SSO Redirect 2021-04-22 15:36:21 -04:00
Paul Belanger
6fb57fb5fc Add bindep.txt file for execution environments
This will be used by ansible-builder, for people creating EEs.

Signed-off-by: Paul Belanger <pabelanger@redhat.com>
2021-04-22 15:27:39 -04:00
sean-m-ssullivan
224c3de2c9 linting 2021-04-22 13:39:34 -05:00
sean-m-ssullivan
ce1f3009f9 add tower workflow schema update 2021-04-22 13:39:33 -05:00
softwarefactory-project-zuul[bot]
4cd4845617 Merge pull request #9990 from tchellomello/issue_238_wait_db_populate
Wait for the database migrations before starting

cc: @shanemcd  @Spredzy
SUMMARY
Before starting the tower-task container, we should wait for the database schema migrations to complete to avoid misleading users.
This is much more evident on newer installations as the tower-task container will be noisy and populated with SQL errors which is a false positive due to the database being populated.
See the ansible/awx-operator#238 for more information
Fixes: ansible/awx-operator#238

ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API

AWX VERSION

devel

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-22 17:51:37 +00:00
Chris Meyers
afe4279e5f fix running analytics for the first time 2021-04-22 13:40:30 -04:00
softwarefactory-project-zuul[bot]
88f70253a5 Merge pull request #9945 from AlanCoding/fileglob
Move to fileglob loop for yml requirement locations

SUMMARY
Overdue followup on #8312
I knew there was more research needed, but didn't know what form it would take until I got my hands dirty.
This entails a look and feel change.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

API

ADDITIONAL INFORMATION

It has a warning... but I don't dislike it.

Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Jake Jackson  <jljacks93@gmail.com>
2021-04-22 16:06:48 +00:00
Marcelo Moreira de Mello
f397679cc5 Wait for the database migrations before starting 2021-04-22 11:51:39 -04:00
softwarefactory-project-zuul[bot]
3fc4baae06 Merge pull request #9975 from mabashian/9852-delete-inv-src
Fixes bug where users could not delete a single inventory source

SUMMARY
link #9852
Also fixes a bug that I came across with deletion warnings.  The deletion warning was showing a count for workflow nodes that referenced any inventory source with the same parent inventory.  For example:
Create an inventory
Create two inventory sources invsrc1 and invsrc2
Create a workflow with a node that syncs invsrc1
Attempt to delete invsrc2
The warning will indicate that there's 1 workflow node that uses the inventory source but that's actually not true.  There should be no deletion warning in this case.
This PR addresses ^^
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-22 15:29:08 +00:00
Jeff Bradberry
65cee65fad Update the docs to remove references to isolated nodes 2021-04-22 10:20:11 -04:00
Jeff Bradberry
17e3279f1c Remove isolated nodes from the API views and serializers 2021-04-22 10:20:11 -04:00
Jeff Bradberry
a17c34f041 Remove the isolation-specific settings
- AWX_ISOLATED_PUBLIC_KEY
- AWX_ISOLATED_PRIVATE_KEY
- AWX_ISOLATED_KEY_GENERATION
- AWX_ISOLATED_HOST_KEY_CHECKING
- AWX_ISOLATED_USERNAME
- AWX_ISOLATED_CONNECTION_TIMEOUT
- AWX_ISOLATED_LAUNCH_TIMEOUT
- AWX_ISOLATED_PERIODIC_CHECK
- AWX_ISOLATED_CHECK_INTERVAL
2021-04-22 10:20:11 -04:00
Jeff Bradberry
1819a7963a Make the necessary changes to the models
- remove InstanceGroup.controller
- remove Instance.last_isolated_check
- remove .is_isolated and .is_controller methods/properties
- remove .choose_online_controller_node() method
- remove .supports_isolation() and replace with .can_run_containerized
- simplify .can_run_containerized
2021-04-22 10:17:02 -04:00
Jeff Bradberry
6a599695db Remove the IsolatedManager and its associated playbooks and plugins 2021-04-22 10:17:02 -04:00
Jeff Bradberry
b0cdfe7625 Clean up the management commands 2021-04-22 10:11:27 -04:00
Jeff Bradberry
efabc05270 Chop out the dev environment isolated node 2021-04-22 10:11:27 -04:00
softwarefactory-project-zuul[bot]
c1a009d128 Merge pull request #9958 from AlexSCorey/9910-PluralAriaLabel
Fixes object rendered on dom in aria-label

SUMMARY
This addresses #9910. Aria-labels that use <Plural/> won't work properly.  In this case I used aria-labelledby and passed it the id of the button.  I tested it with a screen reader and that fixed it.  I also fixed some JobListCancelButton tooltips
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-04-22 13:45:01 +00:00
softwarefactory-project-zuul[bot]
8142f5fb55 Merge pull request #9822 from AlanCoding/boom_no_scripts
Remove custom inventory scripts from the API

SUMMARY
Connect #7775
AWX VERSION
18.0.0

Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-22 13:17:15 +00:00
Alan Rominger
8241ebbc9a Fix migration order of operations bug 2021-04-22 08:36:49 -04:00
Alan Rominger
5f39b6276d Add command to export custom inventory scripts to tar file 2021-04-22 08:36:48 -04:00
Alan Rominger
8c0366675a Remove source_script from awx collection 2021-04-22 08:36:48 -04:00
Alan Rominger
b40e8d15c0 Fix migration bug
Bump migration number

Skip data migration for fresh migrations
  where ContentType for custom inventory scripts
  has not yet been created
    no scripts will exist in this case, so no-op
2021-04-22 08:36:48 -04:00
Alan Rominger
f28ad90bf3 Remove source_script field from serializers
Remove some other uses of source_script
2021-04-22 08:36:48 -04:00
Alan Rominger
8440e3f41d Remove ForeignKey relations involving CustomInventoryScript
Add migration to carry out corresponding schema change

Add data migration to delete inventory sources
  which are the custom type

Split migration into two files
  data migration touches same rows as schema migration
2021-04-22 08:36:48 -04:00
Alan Rominger
33b6da4456 Remove filter_by_class where it was not working 2021-04-22 08:36:48 -04:00
Alan Rominger
a54aab9717 Remove old uses of CustomInventoryScript
some uses are minor references

Fix some test fails
2021-04-22 08:36:48 -04:00
Alan Rominger
38352063e8 Remove custom inventory script API 2021-04-22 08:36:46 -04:00
Alan Rominger
855cb162b7 Change inventory source factory defaults
Also set source_path to a newly merged test-playbooks script
  this gives similar behavior to the prior default script
2021-04-22 08:34:38 -04:00
Jim Ladd
fb97a79aca add clarifying comment re: AUTOMATION_ANALYTICS_LAST_GATHER being set regardless 2021-04-21 21:28:32 -07:00
softwarefactory-project-zuul[bot]
4a8c63c579 Merge pull request #9649 from jakemcdermott/pkg-updates
Fix problematic dependencies

SUMMARY
Fixes high-severity warnings for problematic dependencies.
These fixes required updating react-scripts to a later version, which broke many of our tests due to breaking changes in how test setup works. As such, this PR also updates a lot of tests.

Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-21 23:04:01 +00:00
softwarefactory-project-zuul[bot]
2740155877 Merge pull request #9883 from shanemcd/remove-resource-profiling
Remove resource profiling feature

Reviewed-by: Ryan Petrello <ryan@ryanpetrello.com>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-21 22:25:51 +00:00
softwarefactory-project-zuul[bot]
e67b5f57b4 Merge pull request #9951 from shanemcd/ignore-tls-container-registries
Add option for ignoring tls on Container Registry credentials

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-21 22:18:50 +00:00
Shane McDonald
cfc8b485ee Fix linter 2021-04-21 17:48:21 -04:00
Shane McDonald
21c493724c Remove resource profiling feature 2021-04-21 17:47:45 -04:00
Shane McDonald
658543c0fd Fix up some test fallout 2021-04-21 17:40:43 -04:00
Jake McDermott
562ba53833 Update to react-scripts 4
Co-authored-by: nixocio <nixocio@gmail.com>
2021-04-21 17:33:34 -04:00
Shane McDonald
17b8589ff2 Add option for ignoring tls on Container Registry credentials 2021-04-21 16:28:13 -04:00
Alex Corey
2d2d7b14a9 fixes object rendered on dom in aria-label 2021-04-21 16:07:13 -04:00
Shane McDonald
bcf911daf1 Fix permission assignment on rendered registry auth files
- This file shouldnt need the executable bit
- Should have been setting permissions before writing any data
- No need to close the file since we're using open w/ a context manager
2021-04-21 16:03:11 -04:00
mabashian
968c056057 Fix typo in test mock 2021-04-21 14:47:08 -04:00
mabashian
c48fbec30c Fixes bug where users could not delete a single inventory source 2021-04-21 14:42:38 -04:00
softwarefactory-project-zuul[bot]
0cdf57f31f Merge pull request #9974 from shanemcd/stop-using-devel
Stop instructing folks to install from devel

Reviewed-by: Chris Meyers <None>
2021-04-21 18:00:27 +00:00
Shane McDonald
edaec8dfbb Stop instructing folks to install from devel 2021-04-21 13:22:03 -04:00
softwarefactory-project-zuul[bot]
eec4f8dcc2 Merge pull request #9973 from shanemcd/fix-adhoc-commands
Fix issue where ad-hoc commands for multiple hosts ran on single host

Should resolve #9685

Reviewed-by: Matthew Jones <bsdmatburt@gmail.com>
2021-04-21 17:17:36 +00:00
softwarefactory-project-zuul[bot]
5ef7dd894a Merge pull request #9600 from keithjgrant/3167-variables-formatting
Initialize variables field/detail with formatted JSON strings

SUMMARY
When a variables detail or variables field are mounted with JSON code, this ensures the JSON is formatted with friendly whitespace, regardless how it was originally formatted when saved.
addresses #3167
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Kersom <None>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-21 17:07:46 +00:00
Shane McDonald
7fd5a4e79a Fix issue where ad-hoc commands for multiple hosts ran on single host 2021-04-21 12:41:51 -04:00
softwarefactory-project-zuul[bot]
b862434bec Merge pull request #9689 from rooftopcellist/i18n_devel_translations
I18n devel translations

SUMMARY
First round of translations for ui_next.  I have also included:

necessary changes to import fr, nl, es, zh, and also add them to the catalog.
fixed a syntax error that was keeping strings from compiling.

ISSUE TYPE


Feature

COMPONENT NAME


Translations

AWX VERSION

devel

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
2021-04-21 15:00:29 +00:00
softwarefactory-project-zuul[bot]
f5a69d37dc Merge pull request #9971 from ansible/chrismeyersfsu-more_debug_docs
add slow query tracing to docs

Add information on how to trace slow queries back to awx nodes.

Reviewed-by: Jeff Bradberry <None>
2021-04-21 14:26:04 +00:00
Chris Meyers
54a1712767 add slow query tracing to docs
Add information on how to trace slow queries back to awx nodes.
2021-04-21 09:02:24 -04:00
mabashian
fe4440f7e9 Hide teams option when adding access role to a team 2021-04-20 17:29:10 -04:00
softwarefactory-project-zuul[bot]
ddcbef8545 Merge pull request #9932 from marshmalien/5070-expanded-project-list
Add expanded row content to project list

SUMMARY
#5070
Add the following details to expanded area:

Description
Organization
Execution Environment
Last modified
Last used


ISSUE TYPE


Feature Pull Request

COMPONENT NAME


UI

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-20 21:10:15 +00:00
softwarefactory-project-zuul[bot]
fc2d877983 Merge pull request #9964 from tiagodread/update-ouiaid-relaunch-feature
Adding ouiaid to RelaunchDropdown.jsx

Adding testability to this component

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-20 20:47:55 +00:00
Christian M. Adams
40be9607ee Importing the langs is now done in the lingui config 2021-04-20 16:34:23 -04:00
akus062381
673579fe26 adding ouiaid to relaunchdropdown.jsx 2021-04-20 17:06:51 -03:00
softwarefactory-project-zuul[bot]
0ca024c929 Merge pull request #9912 from fosterseth/fix_t4919_jt_slow_load
Return distinct labels for normal Users

SUMMARY


Create a single label and add it to 2 or more JTs
Visit /api/v2/labels as superuser and you'll see a single label
Create a normal user and give admin role to each JT in step 1
Visit /api/v2/labels as this normal user and you will see duplicate entries for the label. Number of entries will be equal to the number of JTs in step 1


ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 19.0.0

Reviewed-by: Seth Foster <None>
Reviewed-by: Jeff Bradberry <None>
2021-04-20 17:22:35 +00:00
mabashian
07d08b57d1 Fixes typo 2021-04-20 13:12:31 -04:00
mabashian
9540ed4364 Fixes bug where credential form checkboxes were erroneously checked 2021-04-20 13:00:44 -04:00
softwarefactory-project-zuul[bot]
182d4d3098 Merge pull request #9907 from fosterseth/feat_a9212_image_cleanup
Add cleanup_images scheduled task

SUMMARY

#9212
Removes dangling podman images on the system
[70e6cc8a] awx.main.tasks Cleanup execution environment images: deleting quay.io/fosterseth/awx-ee:v1, 643 MB

ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 19.0.0

Reviewed-by: Seth Foster <None>
Reviewed-by: Ryan Petrello <ryan@ryanpetrello.com>
Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-20 16:03:24 +00:00
Marliana Lara
95db251314 Test project list row renders expanded details 2021-04-20 11:28:17 -04:00
Seth Foster
8ab81216f3 unused import 2021-04-20 11:16:32 -04:00
Seth Foster
1e3cfdc986 just remove dangling images 2021-04-20 11:16:32 -04:00
Seth Foster
c64ec6bbf8 check if is_k8s 2021-04-20 11:16:32 -04:00
Seth Foster
4566e7a2a6 check subprocess returncode 2021-04-20 11:16:32 -04:00
Seth Foster
3912f2b57c remove migration file 2021-04-20 11:16:32 -04:00
Seth Foster
fa61ec6b3c Remove system job, replace with scheduled task 2021-04-20 11:16:31 -04:00
Seth Foster
33567f8729 delete_prefix local 2021-04-20 11:16:31 -04:00
Seth Foster
1c888ca58b cleanup stdout 2021-04-20 11:16:31 -04:00
Seth Foster
f98b92073d Add cleanup_images system job template
- Removes podman images on the system that are not assigned to an
execution environment
2021-04-20 11:16:31 -04:00
softwarefactory-project-zuul[bot]
1d89ecaf4f Merge pull request #9954 from jbradberry/missing-dry-run-check
Add in the missing dry-run check for csv analytics collectors

SUMMARY
Follow on bug fix for the analytics gathering feature.  @chrismeyersfsu noticed that dry-run gathers of sufficiently large data was breaking out of the loop after the first csv chunk was packaged.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API

AWX VERSION
awx: 19.0.0

Reviewed-by: Chris Meyers <None>
Reviewed-by: Elijah DeLee <kdelee@redhat.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Julen Landa Alustiza <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-20 15:10:43 +00:00
Seth Foster
7583525366 Return distinct labels for non-admin Users 2021-04-20 10:59:38 -04:00
Christian M. Adams
b729377a2c Fix syntax error with fr translations 2021-04-20 10:57:10 -04:00
Christian M. Adams
c7de869a07 Manually commit in translated ui_next strings 2021-04-20 10:49:46 -04:00
ansible-translation-bot
459874e4b5 UI translation strings for devel branch 2021-04-20 10:24:09 -04:00
Marliana Lara
329df4c0b5 Add expanded row section to project list 2021-04-20 10:10:06 -04:00
Jeff Bradberry
b9389208dd Add in the missing dry-run check for csv analytics collectors 2021-04-20 09:36:29 -04:00
softwarefactory-project-zuul[bot]
ce588a6af5 Merge pull request #9950 from tiagodread/ouia-ids
[Testability] Job template details delete button

Resolves #9510

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-20 00:34:41 +00:00
softwarefactory-project-zuul[bot]
7223ab4d29 Merge pull request #9899 from seiwailai/issue-9898-invalid-type-field
metadata: Fixes invalid model classes field.

Fixes #9441.
SUMMARY

Set type' field's filterable as True only if the model classes contain type field such as UnifiedJob, WorkflowApproval, UnifiedJobTemplate, Project and SystemJobTemplate

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API - metadata.py

AWX VERSION

awx: 19.0.0

ADDITIONAL INFORMATION

Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Sei Wai Lai <None>
2021-04-19 22:44:53 +00:00
Tiago
8135ac4883 job template details delete button 2021-04-19 19:38:25 -03:00
softwarefactory-project-zuul[bot]
16bd9b44dc Merge pull request #9933 from marshmalien/4977-expanded-job-list
Add expanded row content to job list

SUMMARY
#4977
Add the following details to expanded section:

Job Template
Workflow Job Template
Source Workflow Job
Project
Execution Environment


ISSUE TYPE


Feature Pull Request

COMPONENT NAME


UI

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-19 22:28:55 +00:00
softwarefactory-project-zuul[bot]
a857352e30 Merge pull request #9940 from seiwailai/issue-9911-not-display-error-message
CredentialPluginField: Fixes bug to display invalid helper text for empty required field.

Fixes #9911. Include the HTML element of displaying helper text which is similar to FormGroup.tsx's inValidHelperText implementation
Signed-off-by: seiwailai laiseiwai@gmail.com
SUMMARY

Under normal circumstances, we initiate input fields using FormGroup element. However, for credentials purpose, we customized the FormGroup by adding another children element called CredentialPluginInput which comprised of Input Group. Thus, events related to the input fields will happen within the InputGroup logic. However, the Input Group doesn't have the functionality of rendering error at the moment.
Thus, we should explicitly render the error under FormGroup element if there is an error and needed to be displayed.

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


UI: CredentialPluginField.jsx

AWX VERSION

awx=19.0.0

ADDITIONAL INFORMATION


After

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-19 22:20:50 +00:00
softwarefactory-project-zuul[bot]
19da1ad263 Merge pull request #9925 from keithjgrant/4249-prevent-double-launch
Prevent double-clicking/double-launching jobs

SUMMARY
Prevents double-launching a job if the user double-clicks the launch icon. This is done by disabling the button upon first launch. Applied to all instances of <LaunchButton>.
Addresses: #4249
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-19 22:17:21 +00:00
softwarefactory-project-zuul[bot]
e346dbfc97 Merge pull request #9934 from DiegoTc/devel
Updating installation documentation 

Updating installation documentation due to bug. Adding this will prevent users to encounter errrors at the moment of installing awx.
SUMMARY

New users will encounter problems installing awx, as there's a bug using a specific version of minikube. Adding a note, so users are aware of this and don't struggle in the installation process.

ISSUE TYPE


Docs Pull Request

AWX VERSION

latest

ADDITIONAL INFORMATION


https://github.com/ansible/awx-operator/issues/205

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-19 21:58:00 +00:00
Keith J. Grant
dff43e973e add LaunchButton test to cover disabled launch button behavior 2021-04-19 13:09:16 -07:00
Alan Rominger
27d56726a3 Remove yaml_exts play variable 2021-04-19 15:55:29 -04:00
Alan Rominger
032341c7fc Move to fileglob loop for yml requirement locations 2021-04-19 15:45:51 -04:00
seiwailai
a4de7fffaf metadata: Fixes invalid model classes field.
Fixes #9441.
2021-04-20 02:51:46 +08:00
Keith J. Grant
804cf74cd8 fix formatting JSON on initialize 2021-04-19 11:00:27 -07:00
Keith J. Grant
b817967377 delete unused function 2021-04-19 09:38:50 -07:00
Keith J. Grant
768fe94088 initialize variables field/detail with formatted JSON strings 2021-04-19 09:37:42 -07:00
softwarefactory-project-zuul[bot]
8375141d67 Merge pull request #9942 from shanemcd/dont-reap-pods-when-debugging
Dont reap pods when settings.RECEPTOR_RELEASE_WORK = False

Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-04-19 16:06:50 +00:00
Keith J. Grant
5e228c4d98 LaunchButton: rename isSending to isLaunching 2021-04-19 09:05:15 -07:00
Shane McDonald
e30b4ca875 Dont reap pods when settings.RECEPTOR_RELEASE_WORK = False 2021-04-19 09:06:23 -04:00
seiwailai
850d04b5c0 CredentialPluginField: Fixes bug to display invalid helper text for empty required field.
Fixes #9911. Include the jsx element of displaying helper text which is similar to FormGroup.tsx's inValidHelperText implementation

Signed-off-by: seiwailai <laiseiwai@gmail.com>
2021-04-19 14:09:16 +08:00
Diego Turcios
54cb303ac5 Signed-off-by: Diego Turcios <diegoturciostc@gmail.com>
Updating installation documentation due to [bug](https://github.com/ansible/awx-operator/issues/205). Adding this will prevent users to encounter errrors at the moment of installing awx.
2021-04-16 19:34:33 -06:00
Marliana Lara
956cffe073 Add missing details to job list expanded row section 2021-04-16 15:31:08 -04:00
softwarefactory-project-zuul[bot]
d834519aae Merge pull request #9914 from dhoppe/fix_architecture
Define variables in the correct Ansible role

SUMMARY
This pull request is related to #9913.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

Docker

AWX VERSION
awx: 19.0.0

ADDITIONAL INFORMATION
This pull request ensures that tini is downloaded for the correct architecture.
$ grep tini Dockerfil
# Install tini
RUN curl -L -o /usr/bin/tini https://github.com/krallin/tini/releases/download/v0.19.0/tini-arm64 && \
    chmod +x /usr/bin/tini

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-16 17:41:41 +00:00
softwarefactory-project-zuul[bot]
d53d41b84a Merge pull request #9776 from AlexSCorey/9019-MultiChart
Observability Metrics

SUMMARY
This adds the chart for Observability Metrics (#9019).  To see the chart you need to navigate to /metrics.  Also, its best if you run a build that has multiple instances.  This will do that for you COMPOSE_TAG=devel CLUSTER_NODE_COUNT=2 make docker-compose.
When this feature loads the user has to select an instance (1, or all) and a metric to render data on the graph.  Once they select those items, the chart appears and we start to make requests to the api every 3 seconds to get the data. (Currently the api does not support web sockets for this feature) If the user changes the values for either of the drop down items the chart resets.  The chart also only show the last 50 data points.
There is a "tooltip" that is rendered at the bottom left hand side.  I decided to put it there, instead of on the chart itself because this chart could get quite crowded depending the number of data points rendered and the number of instances rendering lines.
The X axis is sort of meaningless.  The values below simply render the number of api requests. This isn't a value of time. Since the main goal of this feature is to show significant changes instead of tryin to pinpoint when the change occurs I felt that showing a time stamp on this axis would crowd the axis as well.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

AWX VERSION
ADDITIONAL INFORMATION

Reviewed-by: Kersom <None>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Mat Wilson <mawilson@redhat.com>
2021-04-15 21:59:28 +00:00
softwarefactory-project-zuul[bot]
a194dfdbbb Merge pull request #9884 from nixocio/ui_issue_9769
Do not allow EE to modify Org

Do not allow EE to modify Org.
See: #9769
Also: #9874

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-15 21:59:19 +00:00
Keith J. Grant
dc0256441f disable launch buttons to prevent double-clicking 2021-04-15 14:51:39 -07:00
softwarefactory-project-zuul[bot]
08a969bf8b Merge pull request #9922 from jbradberry/write-pre-commit-always
Always overwrite the contents of .git/hooks/pre-commit

SUMMARY
Set the make command to always write into the pre-commit hook file, even if it already exists.  This will allow this file to be updated when changes are made without the developer having to jump through hoops or remember that it is a thing.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API

AWX VERSION

Reviewed-by: Ryan Petrello <None>
2021-04-15 20:25:26 +00:00
Jeff Bradberry
2793b5b01e Always overwrite the contents of .git/hooks/pre-commit 2021-04-15 14:21:53 -04:00
softwarefactory-project-zuul[bot]
32200cd893 Merge pull request #9875 from keithjgrant/a11y-fixes
Accessibility fixes

SUMMARY
Fixes numerous accessibility issues, including:

updates CodeEditor so label correctly points at associated textarea
fixes issues with tabs on dashboard and details pages
adds missings ids
adds alt text to logo
removes duplicate ids on some lists

ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

Reviewed-by: Kersom <None>
Reviewed-by: Keith Grant <keithjgrant@gmail.com>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-15 17:39:07 +00:00
softwarefactory-project-zuul[bot]
6fef4e1ab7 Merge pull request #9593 from keithjgrant/7506-yaml-json-eval-fix-2
Don't unnecessarily expand YAML expressions

SUMMARY
Prevents variables fields from expanding YAML expressions when possible:

In the detail view, the user may toggle to JSON (seeing the data structure fully expanded), but toggling back to YAML will continue to display the original un-expanded value with expressions intact
In edit mode, this works the same way, UNLESS the user edits the value while in JSON mode.

Addresses #7506
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

ADDITIONAL INFORMATION

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Chris Meyers <None>
2021-04-15 17:34:44 +00:00
softwarefactory-project-zuul[bot]
ad07d31b9a Merge pull request #9219 from mazhead/devel
Adding the scm_track_submodules option for project

SUMMARY
Adding the scm_track_submodules option which should fix the related #7846
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

API
UI

AWX VERSION
awx: 17.0.1

ADDITIONAL INFORMATION
This option will add the track_submodules option which is described in the ansible git module: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/git_module.html

if yes, submodules will track the latest commit on their master branch (or other branch specified in .gitmodules). If no, submodules will be kept at the revision specified by the main project. This is equivalent to specifying the --remote flag to git submodule update.

Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: None <None>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
2021-04-15 17:28:41 +00:00
mazhead
5bb93e1f5d Update SharedFields.jsx 2021-04-15 15:23:05 +02:00
nixocio
95f5188462 Do not allow EE to modify Org
Do not allow EE to modify Org.

See: https://github.com/ansible/awx/issues/9769
2021-04-15 09:11:26 -04:00
Dennis Hoppe
1d4a83e613 Define variables tini_architecture and kubectl_architecture in the correct Ansible role 2021-04-15 12:38:49 +02:00
Keith J. Grant
8f2ef6ce01 VariablesField: don't run Formik validation on mode change 2021-04-14 16:15:18 -07:00
softwarefactory-project-zuul[bot]
c633313152 Merge pull request #9903 from nixocio/ui_remove_not_used_code
Remove not used code

Remove not used code

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-14 16:35:08 +00:00
Keith J. Grant
637b540a4d fix button selection in VariablesField tests 2021-04-14 09:25:15 -07:00
Keith J. Grant
8dd4e68385 change CodeEditor onChange back to our debounce implementation 2021-04-14 09:25:15 -07:00
Keith J. Grant
dff3103d96 add more robust handling of JSON/YAML toggle to prevent expanding YAML expressions 2021-04-14 09:25:15 -07:00
Keith J. Grant
1bd71024e3 Don't unecessarily expand YAML expressions
If the user toggles a VariablesField to JSON then back to YAML without
editing the field content, revert to the initial YAML value to maintain
any shorthand expressions
2021-04-14 09:22:57 -07:00
Keith J. Grant
634c9892df VariablesDetail: don't evaluate YAML expressions 2021-04-14 09:13:53 -07:00
nixocio
7435458a7b Remove not used code
Remove not used code
2021-04-14 10:36:18 -04:00
softwarefactory-project-zuul[bot]
2ebd4c72c1 Merge pull request #9862 from jakemcdermott/remove-suppress
Use built-in suppress from contextlib

In python3, we use the built-in suppress from contextlib.

Reviewed-by: Ryan Petrello <None>
2021-04-14 12:35:39 +00:00
Keith J. Grant
e05fdf9ebb update tests to match new ids 2021-04-13 13:11:44 -07:00
Keith J. Grant
1dc3b80c68 add missing titles/labels, remove duplicate IDs 2021-04-13 13:11:44 -07:00
Keith J. Grant
77cc3306a5 add typeahead aria labels to all Select boxes 2021-04-13 13:11:44 -07:00
Keith J. Grant
f807b76044 revert RoutedTabs to buttons pending PF fix 2021-04-13 13:11:44 -07:00
Keith J. Grant
ac0f534208 update inventory group tests 2021-04-13 13:11:44 -07:00
Keith J. Grant
c738772cd5 translate brand logo alt text 2021-04-13 13:11:44 -07:00
Keith J. Grant
79118cfbe2 fix Schedule tests 2021-04-13 13:11:44 -07:00
Keith J. Grant
445b2fef84 update VariablesField test for new id 2021-04-13 13:11:44 -07:00
Keith J. Grant
94038006aa fix a11y bugs in RoutedTabs, UserList 2021-04-13 13:11:44 -07:00
Keith J. Grant
be9622d03f fix missing ids/alt for a11y fixes 2021-04-13 13:11:44 -07:00
Keith J. Grant
03fbeb2a27 fix a11y labels on dashboard tabs 2021-04-13 13:11:43 -07:00
Keith J. Grant
30f08582ed add id to code editor input fields 2021-04-13 13:11:43 -07:00
softwarefactory-project-zuul[bot]
6dd5fc937b Merge pull request #9683 from rebeccahhh/devel
Pull with credentials from protected registries

SUMMARY

relates to #7066
if a credential is associated with an EE this will create a JSON authfile that is then passed with the pull request to the host of the registry

ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 18.0.0


TODOs

 Remove separate token field from the registry credential.
 Rename the existing password field to say "password/token"
 Ensure only registry credentials can be associated with an EE #9628
 Write out the auth.json file to the pdd_wrapper_ directory. #9683 (comment)
 Use secure permissions for auth.json #9683 (comment)

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
Reviewed-by: Elijah DeLee <kdelee@redhat.com>
Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Nana  <natr@hey.com>
2021-04-13 20:09:52 +00:00
mazhead
83d340ab1f Updated migration + serializers as suggested
Signed-off-by: mazhead <mazhead@gmail.com>
2021-04-13 21:39:24 +02:00
softwarefactory-project-zuul[bot]
b82318161c Merge pull request #9890 from ryanpetrello/schedule-invalid-ujt
allow schedules to be disabled even if the associated UJT isn't valid

see: #8641

Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Jeff Bradberry <None>
2021-04-13 17:20:51 +00:00
Alex Corey
90081e4e6e updates file names and adds breadcrumb 2021-04-13 12:40:05 -04:00
softwarefactory-project-zuul[bot]
cd372e4c74 Merge pull request #9889 from ryanpetrello/cors-allow-list
update django-cors-headers and switch to inclusive settings name

see: #9177

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-04-13 16:38:15 +00:00
Alex Corey
b933155f07 fixes some domain issues for x and y axis 2021-04-13 12:13:25 -04:00
Alex Corey
51257a2f62 Adds observability metrics chart
wip

tooltip renders with colors and disappears

scales y axis properly

adds legend without buttlets

adds legend data but needs styling

adds legend, and cleans up code

show help text
2021-04-13 12:13:25 -04:00
Rebeccah
0d2ab5f61e add in OR to the UI label for editing a registry credential 2021-04-13 11:54:44 -04:00
Shane McDonald
4a62932ecd Store auth.json is pdd_wrapper directory 2021-04-13 11:54:43 -04:00
Rebeccah
e61d0c5cb7 credential validation for execution envs to allow only registry credentials to be associated with them, also adding security precautions for authfile and password, also combined token & password into one term to align with Quay, and added handling to account for users not filling in credential data and add a has_inputs function to simplify checking if the host, username, and password are present in the credential 2021-04-13 11:54:33 -04:00
Rebeccah
7c57aebd46 if there is a credential associated with an EE, create a JSON structure and write it to a file, then use that file to pull from protected registries from quay and edit the credential type for registries so that they combine the password and token fields into one field 2021-04-13 11:50:29 -04:00
softwarefactory-project-zuul[bot]
98bb296c6a Merge pull request #9874 from fosterseth/fix_a9769_ee_rbac_change_org
Prevent execution environment from being assigned to a new organization

SUMMARY

related #9769

ee organization can be changed to null (less restrictive)
if organization is null, cannot be assigned to org (more restrictive)
if org is assigned, it cannot be set to a different org


ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 19.0.0

Reviewed-by: Kersom <None>
Reviewed-by: Chris Meyers <None>
Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Seth Foster <None>
2021-04-13 15:24:44 +00:00
softwarefactory-project-zuul[bot]
e67923382a Merge pull request #9892 from ryanpetrello/record-unit-id
record the receptor unit ID on the job record for debugging purposes

see: #8641

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-12 21:31:35 +00:00
softwarefactory-project-zuul[bot]
4de7cf0296 Merge pull request #9835 from ryanpetrello/saml-galaxy-cred
automatically setup default Galaxy credentials on SAML login

Reviewed-by: Chris Meyers <None>
2021-04-12 21:16:19 +00:00
Ryan Petrello
4db3c36ac3 record the receptor unit ID on the job record for debugging purposes
see: https://github.com/ansible/awx/issues/8641
2021-04-12 16:53:51 -04:00
softwarefactory-project-zuul[bot]
f5c00431bd Merge pull request #7391 from xstasi/devel
Add tower group for collection modules

SUMMARY
It would be useful to be able to declare module defaults for all tower modules, which is accomplished with module groups.
See: https://docs.ansible.com/ansible/latest/user_guide/playbooks_module_defaults.html
This very simple PR adds the group definition

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-12 20:53:02 +00:00
Ryan Petrello
b5f77bfe4c allow schedules to be disabled even if the UJT isn't valid
see: https://github.com/ansible/awx/issues/8641
2021-04-12 16:01:52 -04:00
Ryan Petrello
f137ff7d43 update django-cors-headers and switch to inclusive settings name
see: https://github.com/ansible/awx/issues/9177
2021-04-12 15:14:27 -04:00
Jake McDermott
2c61e8f6de Use built-in suppress from contextlib
In python3, we can use the built-in suppress from contextlib

https://docs.python.org/3/library/contextlib.html#contextlib.suppress
2021-04-12 14:47:50 -04:00
Seth Foster
1e4b44e54f Prevent ee from being assigned to a new organization
- ee organization can be changed to null (less restrictive)
- if organization is null, cannot be assigned to org (more restrictive)
- if org is assigned, it cannot be set to a different org
2021-04-12 14:15:21 -04:00
softwarefactory-project-zuul[bot]
c72cc6486c Merge pull request #9537 from AlexSCorey/lingUIUpdate
Updates Ling UI

SUMMARY
This PR updates Ling ui. One of the reasons for updating this dependency was that they were deprecating withI18n().  They changed their minds on that so we didn't need to urgently remove all those HOCs.  Thus, we can now make that conversion a bit slower a couple of files at a time.
One other thing:  When we are changing the string based on a count of an item (ie. Cancel Job vs. Cancel Jobs) we should use ling ui's <Plural> component. However, in order to show the update strings passed to that component the developer will have to run npm run extract-strings each time they are changed to render the updated strings properly. More info here.
ISSUE TYPE
-dependency  upgrade
COMPONENT NAME

UI

AWX VERSION
ADDITIONAL INFORMATION

Reviewed-by: Kersom <None>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Sergio Moreno <sergiomorenoalbert@gmail.com>
2021-04-12 17:57:27 +00:00
softwarefactory-project-zuul[bot]
9ee7281b0b Merge pull request #9886 from ryanpetrello/autoflake
sprinkle back in some flake8 to catch missing imports

Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Ryan Petrello <None>
2021-04-12 17:35:40 +00:00
mazhead
5f93ba7690 Update awx/ui_next/src/screens/Project/shared/ProjectSubForms/SharedFields.jsx
Accept suggestion

Co-authored-by: Shane McDonald <me@shanemcd.com>
2021-04-12 19:02:51 +02:00
Ryan Petrello
300f5a3a1f use flake8 to lint for a few things black doesn't catch
black does *not* warn about missing or extraneous imports,
so let's bring back flake8 in our linting to check for them
2021-04-12 12:55:39 -04:00
mazhead
9f68ffc1cc Update default
Signed-off-by: mazhead <mazhead@gmail.com>
2021-04-12 18:27:16 +02:00
softwarefactory-project-zuul[bot]
ae1fd5a814 Merge pull request #9885 from beeankha/remove_old_tower_name_from_docs
Change Reference of 'ansible-tower-service' to 'automation-controller-service' in Docs File

Related to the work done in #9720

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-12 15:29:07 +00:00
mazhead
f1a987793c Black fix
Signed-off-by: mazhead <mazhead@gmail.com>
2021-04-12 16:58:28 +02:00
beeankha
7c13d749b1 Change 'ansible-tower-service' to 'automation-controller-service' 2021-04-12 10:56:55 -04:00
mazhead
d479237734 Fix merge issue
Signed-off-by: mazhead <mazhead@gmail.com>
2021-04-12 16:47:44 +02:00
softwarefactory-project-zuul[bot]
bdd41c70af Merge pull request #9847 from fosterseth/fix_t4922_job_elapsed_time_incorrect
Fix elapsed time on job showing incorrect value

SUMMARY

Elapsed time would always stay at zero

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 18.0.0

Reviewed-by: Seth Foster <None>
Reviewed-by: Ryan Petrello <None>
Reviewed-by: Alan Rominger <arominge@redhat.com>
Reviewed-by: Jeff Bradberry <None>
2021-04-12 14:35:04 +00:00
mazhead
c6eb7da68d Adding the scm_track_submodules option which should fix the https://github.com/ansible/awx/issues/7846
Signed-off-by: mazhead <mazhead@gmail.com>
2021-04-12 16:22:23 +02:00
softwarefactory-project-zuul[bot]
311c44341e Merge pull request #9873 from wenottingham/not-any-more-they-arent
Update templates for installer changes

SUMMARY
Some of the options aren't valid any more.

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-09 22:20:47 +00:00
Bill Nottingham
d012362ade Update templates for installer changes 2021-04-09 17:42:42 -04:00
softwarefactory-project-zuul[bot]
ce2e41a6fa Merge pull request #9858 from marshmalien/7662-expanded-template-list-item
Add missing template list expanded section details

SUMMARY
Issue: #7662

Add the following detail items:

Description
Organization and link to organization details
Credentials


Move Credential and Label details to the bottom of the expanded section and make them stretch the entire width of the row.


COMPONENT NAME


UI

Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-09 21:10:12 +00:00
Marliana Lara
62c91aea4a Fix bug where falsy details return 0 2021-04-09 15:54:38 -04:00
softwarefactory-project-zuul[bot]
a0780aa287 Merge pull request #9586 from keithjgrant/8906-code-editor-validation-2
Add VariablesField YAML/JSON validation

SUMMARY
Validates YAML or JSON syntax in the variables field on blur. Prevents formik from submitting the form while this error is present.
addresses #8906, #8907
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

ADDITIONAL INFORMATION

Reviewed-by: Kersom <None>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-09 19:07:50 +00:00
Marliana Lara
0bc4702a26 Add execution environment detail to template expanded row 2021-04-09 14:40:59 -04:00
softwarefactory-project-zuul[bot]
6e46183ba6 Merge pull request #9814 from nixocio/ui_issue_9176
Do not validate optional survey

Do not validate optional survey.
See: #9176

Reviewed-by: Marliana Lara <marliana.lara@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-09 17:35:22 +00:00
softwarefactory-project-zuul[bot]
8a86867f69 Merge pull request #9861 from jakemcdermott/fix-9296
Fix non-translatable template string

SUMMARY
The template string for the trademark doesn't seem like it can be used for a valid translation key. This caused the raw variable to be displayed for production builds instead of a readable string.  see: #9296 (comment)
ADDITIONAL INFORMATION
Screenshots, after applying this patch:
development environment


production build

Reviewed-by: Kersom <None>
2021-04-09 16:53:36 +00:00
softwarefactory-project-zuul[bot]
c7a2a1b9f6 Merge pull request #9869 from jakemcdermott/fix-cred-validation-prop
Use validated prop in cred plugin field

SUMMARY
Fxes an initialization bug for cred plugin fields, introduced by this commit
This pr applies the patch described below:
cc @marshmalien @unlikelyzero

before


after

Reviewed-by: John Hill <johill@redhat.com>
2021-04-09 16:20:20 +00:00
Jake McDermott
4e75e9438e Use validated prop in cred plugin field 2021-04-09 10:50:58 -04:00
Jake McDermott
b75d0c1dad Fix non-translatable template string 2021-04-08 19:09:19 -04:00
Marliana Lara
aa69a493b6 Add remaining expanded template list item details 2021-04-08 16:03:46 -04:00
softwarefactory-project-zuul[bot]
cb32f5b096 Merge pull request #9755 from nixocio/ui_issue_9752
Remove isolated and controller from the UI

Remove isolated and controller from the UI.
See: #9752

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-08 18:48:17 +00:00
Seth Foster
89e28d6d4a fix awx_collections tests by comparing Decimal to float, instead of comparing strings 2021-04-08 13:38:35 -04:00
Seth Foster
f05ffa521a the returned self.elapsed should be decimal, instead of float, to match django model field type 2021-04-08 11:36:40 -04:00
Alex Corey
a3aab7228d updates importing messages properly 2021-04-08 09:58:53 -04:00
Alex Corey
385c4a16db updates the method of loading locales 2021-04-08 09:14:41 -04:00
Alex Corey
43c8cabaa6 Updates Lingui 2021-04-08 09:14:40 -04:00
softwarefactory-project-zuul[bot]
b85559fe13 Merge pull request #9848 from marshmalien/subscription-docs-link
Update subscription docs link to use single source of truth

SUMMARY
Related: #8428

Update subscription edit form documentation links to use the docs link utility.
Fix broken unit tests

COMPONENT NAME


UI

Reviewed-by: Keith Grant <None>
2021-04-07 21:54:27 +00:00
Seth Foster
09c176847d string 2021-04-07 17:30:46 -04:00
Marliana Lara
5ff2e7442c Update subscription docs link to use single source of truth 2021-04-07 16:21:52 -04:00
softwarefactory-project-zuul[bot]
6eb1e147a1 Merge pull request #9840 from shanemcd/bump-19
Update version and changelog for version 19

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Ryan Petrello <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-07 19:59:11 +00:00
Seth Foster
8c73a51730 Fix elapsed time on job showing incorrect value
- job elapsed time showed 0.0, during and after the job run
2021-04-07 15:54:43 -04:00
softwarefactory-project-zuul[bot]
725fe99df8 Merge pull request #9844 from nixocio/ui_fix_plural_issue
Fix issue related to plural

Fix issue related to plural
Manually tested. make ui-devel

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-07 19:13:54 +00:00
softwarefactory-project-zuul[bot]
840f5b7264 Merge pull request #9836 from jakemcdermott/fix-9830-9296
Use shared logo img and dynamic copyright date

for #9830, #9296

Reviewed-by: Kersom <None>
2021-04-07 19:05:50 +00:00
nixocio
98dd3c7798 Fix issue related to plural
Fix issue related to plural
2021-04-07 14:41:21 -04:00
softwarefactory-project-zuul[bot]
e8f0a3dbd5 Merge pull request #9843 from tiagodread/fix-doc-link
Remove duple // for docs link on PageHeaderToolBar

Related: #9842

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-07 18:28:45 +00:00
Keith J. Grant
812a4e53df add VariablesField YAML/JSON validation 2021-04-07 11:16:44 -07:00
softwarefactory-project-zuul[bot]
f9981c0825 Merge pull request #9496 from marshmalien/settings-subscription-wizard
Subscription wizard

SUMMARY

Adds subscriptions routes
Extends Config context to return an array with two items: config state and config setter

Update components that use Config with the new return pattern


Move mock config into setupTests.js
Return only the routes the user is "authorized" (valid license key) to view

Subscription Details view: /settings/subscription/details

This is our standard details view
Clicking Edit will send the user to subscription wizard view /settings/subscription/edit
Route is not accessible when license type is OPEN

Subscription Add wizard view: /settings/subscription_management
Step 1 - Subscription:

If a user does not have a Red Hat Ansible Automation Platform subscription, they can request a trial subscription via the link
Toggle between uploading a subscription manifest .zip file or retrieving subscriptions using Red Hat credentials (username and password)
Get Subscriptions button fetches subscriptions and displays them in a modal



Step 2 - Tracking and analytics:

Shows two checkboxes to enable User analytics and Automation analytics
If the user has previously selected the RH subscription manifest flow, checking the Automation Analytics box will display required RH username and password fields
If the user has previously selected the RH username/password flow, they will not see this additional username/password field if Automation Analytics is checked


Step 3 - EULA: https://tower-mockups.testing.ansible.com/patternfly/settings/settings-license-step-03/

Submission should show a success message and navigate user to dashboard if this is the initial launch and to the subscription detail view if they are editing the subscription
Failed submission should show a wizard form error

ISSUE TYPE

Feature

COMPONENT NAME

UI

ADDITIONAL INFORMATION

Reviewed-by: Michael Abashian <None>
Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-07 18:13:48 +00:00
Jake McDermott
ee68a7ff09 Update CHANGELOG.md 2021-04-07 13:52:58 -04:00
Tiago
84e6980e49 Remove duple // 2021-04-07 14:52:15 -03:00
softwarefactory-project-zuul[bot]
091027fefc Merge pull request #9803 from shanemcd/cluster-migrate-once
Cluster dev env: only run migrations on first node

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-07 16:59:52 +00:00
Shane McDonald
5df50066a6 Update version and changelog for version 19 2021-04-07 12:29:34 -04:00
Jake McDermott
6da224f27e Ignore no-literal rule for AboutModal component 2021-04-07 11:14:22 -04:00
Ryan Petrello
8ea247123a automatically setup default Galaxy credentials on SAML login 2021-04-07 10:19:19 -04:00
Jake McDermott
3f040eba6d Use shared logo img and dynamic copyright date 2021-04-07 10:01:27 -04:00
softwarefactory-project-zuul[bot]
d309f8c54b Merge pull request #9825 from jbradberry/analytics-naive-datetimes-fix
Adjust datetimes to be aware when using awx-manage gather_analytics

SUMMARY
Adjust datetimes to be aware when using awx-manage gather_analytics
Also, make sure that an explicit since parameter will win over
default until=now() when calculating the 4-week data limit.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

API

AWX VERSION

Reviewed-by: Ryan Petrello <None>
2021-04-07 13:54:52 +00:00
softwarefactory-project-zuul[bot]
f48e600563 Merge pull request #9673 from jborean93/pwsh-request
Fix up request tower ps script

SUMMARY
Fixes the request_tower_configuration.ps1 script with the following:

Added PowerShell 6+ support, can now run on Linux
Removes the uneeded strict and ErrorActionPreference settings which could impact the global settings
Enables TLS 1.2 support on Windows PowerShell
Fixes -insecure handling for certificates

Works across ps versions
Original didn't actually work (at least in my testing)
Hopefully doesn't impact the global state


Fixes IE not loaded error on Windows PowerShell when running on a new profile
Changes the encoding to UTF-8 (no BOM) and made it executable

Can now be invoked on Linux like ./request_tower_configuration.ps1 ...
There are no non-ASCII chars in the script so this won't matter on Windows



Fixes #9434
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

Tools

AWX VERSION
N/A

Reviewed-by: Ryan Petrello <None>
2021-04-07 13:18:43 +00:00
softwarefactory-project-zuul[bot]
a10c3c0493 Merge pull request #9827 from ansible/jakemcdermott-playbook-max-size
Limit the visible playbook select region

SUMMARY
before

after

Reviewed-by: Kersom <None>
2021-04-07 01:06:55 +00:00
Jake McDermott
2dc9c1a1c8 Limit the visible playbook select region 2021-04-06 17:36:42 -04:00
softwarefactory-project-zuul[bot]
229a3d6f23 Merge pull request #9758 from nixocio/ui_issue_9187
Do not allow user to attempt to delete a running job

Do not allow user to attempt to delete a running job
See: #9187

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Kersom <None>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-06 21:32:13 +00:00
softwarefactory-project-zuul[bot]
478e8c0c0b Merge pull request #9821 from ryanpetrello/analytics-null-byte
replace null unicode with nothing in analytics collection

replaces #9279
cc @Ladas

Reviewed-by: Chris Meyers <None>
2021-04-06 21:16:12 +00:00
Marliana Lara
440bdee56d Add subscription wizard and redirect logic 2021-04-06 17:09:33 -04:00
softwarefactory-project-zuul[bot]
868f68035f Merge pull request #9819 from shanemcd/fix-reaper
Update pod reaper to work with receptor launched pods

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Alan Rominger <arominge@redhat.com>
2021-04-06 20:32:55 +00:00
softwarefactory-project-zuul[bot]
84ab88b073 Merge pull request #9710 from nixocio/ui_issue_6663
Make Org a required field for org admins on WFJT

Make Org a required field for org admins on WFJT.
See: #6663

Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-06 20:32:51 +00:00
Jeff Bradberry
62c7554ec4 Adjust datetimes to be aware when using awx-manage gather_analytics
Also, make sure that an explicit `since` parameter will win over
default `until=now()` when calculating the 4-week data limit.
2021-04-06 15:59:54 -04:00
softwarefactory-project-zuul[bot]
3742090d6f Merge pull request #9804 from sean-m-sullivan/job_template_instance_groups
instance groups options for modules

SUMMARY
Add ability to set instance groups in organization, job templates, and inventories.
#9788
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

awx-collection

AWX VERSION
18.0.0

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-06 19:27:19 +00:00
softwarefactory-project-zuul[bot]
c3736134ed Merge pull request #9815 from keithjgrant/4837-docs-links
Create single source of truth for outgoing Docs link URLs

SUMMARY
Adds a utility function to generate links to the correct version of documentation and updates/adds a number of docs links throughout the app.
Addresses #8428
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-04-06 19:22:19 +00:00
softwarefactory-project-zuul[bot]
d6964c7266 Merge pull request #9818 from jakemcdermott/fix-9817
Configure ace editor to not use blob worker

SUMMARY
Intended to address #9817

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Ryan Petrello <None>
2021-04-06 19:22:16 +00:00
sean-m-ssullivan
9d500e89f5 update test logic 2021-04-06 13:48:05 -05:00
Keith J. Grant
37a4f2975b add tests for getDocsBaseUrl util 2021-04-06 11:45:31 -07:00
Ryan Petrello
f694cd14d7 replace null unicode with nothing in analytics collection 2021-04-06 14:19:21 -04:00
softwarefactory-project-zuul[bot]
62be41036c Merge pull request #9358 from jbradberry/job-event-analytics-v1
Gather job event analytics by last pk instead of created datetime

SUMMARY
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

API

AWX VERSION
awx: 17.0.1

Reviewed-by: Bill Nottingham <None>
Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Ryan Petrello <None>
Reviewed-by: Ladislav Smola <lsmola@redhat.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Jim Ladd <None>
Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
2021-04-06 18:02:22 +00:00
Keith J. Grant
d924b873b3 update existing docs links to use current version util 2021-04-06 10:46:28 -07:00
softwarefactory-project-zuul[bot]
33f1197b23 Merge pull request #9813 from nixocio/ui_capital_issue
Update capitalization for a few screens

Update capitalization for EE and Instance Groups screens to better align
with mock ups.

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-06 17:15:21 +00:00
softwarefactory-project-zuul[bot]
e5159fd28d Merge pull request #9662 from jakemcdermott/fix-9636
Fix cred type display on form initialization

SUMMARY
For #9636 and #8828

Reviewed-by: Kersom <None>
2021-04-06 16:30:01 +00:00
nixocio
e843872b98 Do not allow user to attempt to delete a running job
Do not allow user to attempt to delete a running job

See: https://github.com/ansible/awx/issues/9187
2021-04-06 10:24:51 -04:00
Jake McDermott
f444870c0c Disable credential type field on edit 2021-04-06 09:04:00 -04:00
Jake McDermott
6dac50b1e0 Display cred type name on initialization 2021-04-06 09:03:53 -04:00
Jake McDermott
241f73ebf7 Configure ace editor to not use blob worker
We don't rely on ace-editor using the blob worker
and leaving it on causes CSP errors.
2021-04-06 08:56:15 -04:00
Keith J. Grant
4227f7276b add docs links to notification templates, project scm 2021-04-05 15:41:33 -07:00
Keith J. Grant
64b9d61dd4 add some links to docs 2021-04-05 15:41:33 -07:00
Shane McDonald
2d48b24ef2 Update pod reaper to work with receptor launched pods 2021-04-05 17:45:15 -04:00
Shane McDonald
6294ddfded AWX_CONTAINER_GROUP_KEEP_POD -> RECEPTOR_KEEP_WORK 2021-04-05 17:44:40 -04:00
Jeff Bradberry
f8b91f9b0e Fixes
- use parse_datetime from Django for the datetime_hook
- deal with a fencepost error in the events slicer
2021-04-05 13:58:32 -04:00
Jeff Bradberry
f85e8a44de Properly parse datetimes from AUTOMATION_ANALYTICS_LAST_ENTRIES 2021-04-05 13:58:32 -04:00
Jeff Bradberry
6030c5cf4c Rationalize the interval calculations for analytics gathering
- `since` should not be after `until`
- neither `since` nor `until` should be in the future
- `since`, `AUTOMATION_ANALYTICS_LAST_GATHER`, and `AUTOMATION_ANALYTICS_LAST_ENTRIES[key]` should be truncated to 4 weeks prior to `until`
- an explicit `since` parameter should always take precedence over the settings values
2021-04-05 13:58:32 -04:00
Jeff Bradberry
8ce3a14da5 A couple more fixes:
- stop trying to ship csv slices when one breaks
- only update LAST_ENTRIES if all of the files in a time/pk slice succeed
- don't allow an explicit --until parameter to set the GATHER/ENTRIES values backwards
2021-04-05 13:58:32 -04:00
Jeff Bradberry
1dacd7e8cf Only clean up tarballs if we had all successfully ship 2021-04-05 13:58:32 -04:00
Jeff Bradberry
39886da4b6 Deal with datetimes in AUTOMATION_ANALYTICS_LAST_ENTRIES 2021-04-05 13:58:32 -04:00
Jeff Bradberry
99daa4319e Require the config.json file to be in dry-run tarballs 2021-04-05 13:58:32 -04:00
Jeff Bradberry
3568558571 A couple of bug fixes 2021-04-05 13:58:32 -04:00
Jeff Bradberry
0b31e771b1 Fix the gather_analytics management command
Previously, invoking the command with neither of the --ship or
--dry-run flags would result in effectively doing a dry run.  With the
stricter checks now in place in analytics.core.gather, let's make sure
that we pass the 'dry-run' parameter in to gather() in the no-flags
case.
2021-04-05 13:58:32 -04:00
Jeff Bradberry
772da61980 If a csv collector is successful but results in no files, increment anyway 2021-04-05 13:58:32 -04:00
Jeff Bradberry
9cde10c93a Fix problems with the package() function 2021-04-05 13:58:32 -04:00
Jeff Bradberry
1bf37266b4 Differentiate the log level depending on whether we are run from the task 2021-04-05 13:58:32 -04:00
Jeff Bradberry
77f7e88e68 Address the problems with trying to use a JSONField 2021-04-05 13:58:32 -04:00
Jeff Bradberry
3e4e255d3f Require config collector data for all posts to analytics
We need the cluster ID when consuming all incoming data.
2021-04-05 13:58:32 -04:00
Jeff Bradberry
a448cb17d9 Refactor analytics.gather
With the change to use pk-based interval slicing for the job events
table, we need analytics.gather to be the code that manages all of the
"expensive" collector slicing.  While we are at it, let's ship each
chunked tarball file as we produce it.
2021-04-05 13:58:32 -04:00
nixocio
eda9bcbf62 Do not validate optional survey
Do not validate optional survey.

See: https://github.com/ansible/awx/issues/9176
2021-04-05 13:30:24 -04:00
nixocio
87c03c1139 Update capitalization for a few screens
Update capitalization for EE and Instance Groups screens to better align
with mock ups.
2021-04-05 12:59:36 -04:00
softwarefactory-project-zuul[bot]
775c0b02ee Merge pull request #9811 from wenottingham/irc-change
Move to webchat.freenode.net.

SUMMARY
See #9806

Reviewed-by: Ryan Petrello <None>
2021-04-05 15:44:04 +00:00
Bill Nottingham
806d04c9b0 Move to webchat.freenode.net. 2021-04-05 11:13:51 -04:00
softwarefactory-project-zuul[bot]
434c0fcd86 Merge pull request #9809 from shanemcd/update-image-ref
Update placeholder image variable in inventory file

Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-04-05 15:11:43 +00:00
softwarefactory-project-zuul[bot]
9238b66344 Merge pull request #9802 from shanemcd/remove-more-ansible
Remove invocation of Ansible from launch script

This was missed in the initial EE PR. Ansible is no longer installed inside of the web & task containers, causing this to show up in the container logs:
/usr/bin/launch_awx.sh: line 18: ansible: command not found
/usr/bin/launch_awx.sh: line 19: ansible: command not found

Reviewed-by: Ryan Petrello <None>
2021-04-05 15:10:37 +00:00
softwarefactory-project-zuul[bot]
6b1ee7f126 Merge pull request #9777 from nixocio/ui_issue_9770
Filter EE also by Organization for JT

Filter EE also by Organization for JT.
See: #9770

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-04-05 14:54:59 +00:00
softwarefactory-project-zuul[bot]
f7e5f7c434 Merge pull request #9810 from jogleasonjr/patch-1
Fix docker-compose up options

SUMMARY
Should the up options be after the up command? I'm assuming COMPOSE_UP_OPTS exists so we can run detached like so:
COMPOSE_UP_OPTS=-d make docker-compose
If I am misunderstanding the purpose of COMPOSE_UP_OPTS, is there other guidance on how to autostart AWX detached?
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

Installer

AWX VERSION
awx: 18.0.0

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-05 13:41:40 +00:00
John Gleason
e074872b8d Fix docker-compose up options
Should the `up` options be after the `up` command? I'm assuming `COMPOSE_UP_OPTS` exists so we can run detached like so:

`COMPOSE_UP_OPTS=-d make docker-compose`

If I am misunderstanding the purpose of `COMPOSE_UP_OPTS`, is there other guidance on how to autostart AWX detached?
2021-04-05 08:04:25 -05:00
Shane McDonald
2e6e38e77c Update placeholder image variable in inventory file 2021-04-05 09:03:47 -04:00
sean-m-ssullivan
46fb2d2086 linting 2021-04-03 14:04:42 -05:00
sean-m-ssullivan
f9d2db696b add instance groups 2021-04-03 14:00:56 -05:00
Sean Sullivan
f35ce93fb1 Merge pull request #64 from ansible/devel
Rebase
2021-04-03 13:17:25 -05:00
Shane McDonald
7b25216ee9 Cluster dev env: only run migrations on first node 2021-04-03 13:23:29 -04:00
Shane McDonald
f985376d64 Remove invocation of Ansible from launch script
This was missed in the initial EE PR. Ansible is no longer installed inside of
the web & task containers, causing this to show up in the container logs:

```
/usr/bin/launch_awx.sh: line 18: ansible: command not found
/usr/bin/launch_awx.sh: line 19: ansible: command not found
```
2021-04-03 11:53:41 -04:00
softwarefactory-project-zuul[bot]
91c2f80e22 Merge pull request #9797 from shanemcd/nicer-logs
Make logs more readable in development environment

This uses https://github.com/coderanger/supervisor-stdout to prefix process
names before log messages in the dev env
Before:

After:

Reviewed-by: Jim Ladd <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-04-03 15:50:09 +00:00
Shane McDonald
fccfef442c Make logs more readable in development environment
This uses https://github.com/coderanger/supervisor-stdout to prefix process
names before log messages in the dev env
2021-04-02 14:16:51 -04:00
softwarefactory-project-zuul[bot]
941e99018a Merge pull request #9737 from jlmitch5/workflowConvergence
workflow convergence

Satisfies #7669
This adds the ability to set convergence from any nodes (default) to all nodes to the workflow feature.  Specifically:
There is an additional convergence dropdown located on the bottom of the first "node type" step for all node types:

This field defaults to "Any" on add node and whatever the api has the field set to on edit node.  It resets to any if you change the node type dropdown (even on edit when changing and then changing back to the original type...I can update that point depending on what UX is preferred).
tvo created a new link explicitly to the explanation in documentation of what the convergence setting does here, and I link to it in the help popover shown in the screenshot below.
Consistent with the old UI, When "All" is selected, a small tab is displayed with the label "ALL" in the node visualizer.  "Any" nodes do not get any sort of tab.

A slight tweak compared to the old ui...I set the tab's border and background to be the same color as the border of the node to create a consistent look for the node across various states and confirmed this behavior was good with @trahman73
OLD:



NEW:

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: John Hill <johill@redhat.com>
2021-04-02 16:53:50 +00:00
softwarefactory-project-zuul[bot]
3964d7aa20 Merge pull request #9720 from Spredzy/rename_to_controller
Rename ansible-tower file to automation-controller

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-02 09:58:48 +00:00
Alessandro Grassi
664d19510f Add tower group for collection modules 2021-04-02 08:51:02 +02:00
Graham Mainwaring
b3d1c7ff9f Add force parameter to argument_spec 2021-04-01 20:47:30 -04:00
Graham Mainwaring
caec347371 Make sure changed is always set 2021-04-01 20:45:11 -04:00
Graham Mainwaring
26154d22d3 Make tower_license module idempotent
Signed-off-by: Graham Mainwaring <graham@mhn.org>
2021-04-01 20:45:11 -04:00
Yanis Guenane
f89cf95c51 Rename ansible-tower file to automation-controller 2021-04-01 21:09:48 +02:00
John Hill
e90f720153 Attempt at adding locators for select options 2021-04-01 15:08:14 -04:00
John Mitchell
06f8867417 update selectos for convergence 2021-04-01 13:06:31 -04:00
John Mitchell
225c3263d0 add convergence to workflows 2021-04-01 13:06:31 -04:00
softwarefactory-project-zuul[bot]
2594b90565 Merge pull request #9786 from Spredzy/wheel_again
Add wheel in venv creation

The generated based venv from python3.8 -m venv vs. virtualenv -p python38 is different. This changes aims to address the differences.
It was introduced as part of the Python 3.8 migration.
#8778

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-04-01 16:06:12 +00:00
Yanis Guenane
1a8a137e9c Add wheel in venv creation
The generated based venv from `python3.8 -m venv` vs. `virtualenv -p
python38` is different. This changes aims to address the differences.

It was introduced as part of the Python 3.8 migration.
https://github.com/ansible/awx/pull/8778
2021-04-01 17:20:41 +02:00
nixocio
ff7a7945ca Filter EE also by Organization for JT
Filter EE also by Organization for JT.

See: https://github.com/ansible/awx/issues/9770
2021-03-31 17:06:25 -04:00
softwarefactory-project-zuul[bot]
b9d92ff4fd Merge pull request #9775 from shanemcd/bump-receptor
Update receptor version used in dev environment

Reviewed-by: Jeff Bradberry <None>
2021-03-31 20:49:57 +00:00
softwarefactory-project-zuul[bot]
416951ca86 Merge pull request #9774 from shanemcd/receptorctl-pypi
Use receptorctl from pypi

Reviewed-by: Yanis Guenane <None>
2021-03-31 20:40:03 +00:00
Shane McDonald
5180fccd12 Update receptor version used in dev environment 2021-03-31 16:20:26 -04:00
Shane McDonald
c39a4051d7 Use receptorctl from pypi 2021-03-31 15:10:25 -04:00
softwarefactory-project-zuul[bot]
5eae035f60 Merge pull request #9773 from jakemcdermott/fix-9772
Fix rounding error in output pagination controls

for #9772

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-31 19:01:11 +00:00
Jake McDermott
6047eb6172 Fix rounding error in output pagination controls 2021-03-31 12:30:46 -04:00
softwarefactory-project-zuul[bot]
7f176b988f Merge pull request #9708 from beeankha/bump_ipython_version
Bump Up Version of iPython to be Compatible with Python 3.8.5

SUMMARY

Problem:
With Python version being upgraded, iPython now throws errors like this in the AWX shell:
bash-4.4$ echo "from datetime import timedelta; job = Job.objects.get(id=3); job.job_events.update(created=F('created') - timedelta(weeks=5))" | awx-manage shell_plus
~~snip~~
In [1]: ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/usr/lib64/python3.8/codeop.py in __call__(self, source, filename, symbol)
    134 
    135     def __call__(self, source, filename, symbol):
--> 136         codeob = compile(source, filename, symbol, self.flags, 1)
    137         for feature in _features:
    138             if codeob.co_flags & feature.compiler_flag:
TypeError: required field "type_ignores" missing from Module

TypeError: required field "type_ignores" missing from Module is mentioned in this iPython issue:
ipython/ipython#12558
Solution:
Upgrade iPython to latest version, which is 7.21.0. After doing this, the same command run in the shell works:
bash-4.4$ echo "from datetime import timedelta; job = Job.objects.get(id=3); job.job_events.update(created=F('created') - timedelta(weeks=5))" | awx-manage shell_plus
~~snip~~
In [1]: Out[1]: 16
In [2]: Do you really want to exit ([y]/n)? 


ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 18.0.0

Reviewed-by: Seth Foster <None>
Reviewed-by: Jeff Bradberry <None>
2021-03-31 15:23:29 +00:00
Bianca Henderson
730741e978 Merge branch 'devel' into bump_ipython_version 2021-03-31 10:49:24 -04:00
softwarefactory-project-zuul[bot]
45d9ec94ad Merge pull request #9585 from keithjgrant/8031-variables-expand-2
Add Expand button to variables fields

SUMMARY
Adds expand button to variables fields and details. Clicking it opens the code editor & YAML/JSON toggles in a large modal
Addresses #8031
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

ADDITIONAL INFORMATION

Reviewed-by: Kersom <None>
Reviewed-by: Mat Wilson <mawilson@redhat.com>
2021-03-30 22:37:40 +00:00
softwarefactory-project-zuul[bot]
85b3d7c515 Merge pull request #9739 from nixocio/ui_issue_9723
Add templates screen to EE

Add templates screen to EE.
See: #9723

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-30 19:58:13 +00:00
nixocio
e56c5dbfe3 Remove isolated and controller from the UI
Remove isolated and controller from the UI.

See: https://github.com/ansible/awx/issues/9752
2021-03-30 14:19:13 -04:00
softwarefactory-project-zuul[bot]
5cd44cde99 Merge pull request #9754 from shanemcd/git-race
Fix race condition that causes InvalidGitRepositoryError

Reviewed-by: Elijah DeLee <kdelee@redhat.com>
2021-03-30 18:06:32 +00:00
nixocio
86a22927cd Make Org a required field for org admins on WFJT
Make Org a required field for org admins on WFJT.

See: https://github.com/ansible/awx/issues/6663
2021-03-30 13:38:49 -04:00
Shane McDonald
4a726b7f6f Fix race condition that causes InvalidGitRepositoryError 2021-03-30 13:33:17 -04:00
softwarefactory-project-zuul[bot]
16c18886e8 Merge pull request #9729 from sean-m-sullivan/project_update_changed
Update changed logic on project update

SUMMARY
Related to #8349
Found the inventory source does not have a way to track it, so did not do that part.
However scm revision is tracked for project update, as we already retrieve this data when looking for the existing item and waiting, put in logic to compare the two values when wait is true.
Also double checked the integration tests, and believe this should not change them, as its looking for result is success not changed in all but the first update.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

awx_collection

AWX VERSION
18.0.0

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-03-30 15:07:45 +00:00
softwarefactory-project-zuul[bot]
99e65300a2 Merge pull request #9686 from nixocio/ui_issue_9416
Update RBAC for EE

Update RBAC for EE details page.
See: #9416

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-30 14:59:47 +00:00
softwarefactory-project-zuul[bot]
c16079e5f8 Merge pull request #9741 from shanemcd/fix-project-inventories
Fix inventories-from-projects when running in Kubernetes

Related: #9704
Will also require a new release of the operator which will contain ansible/awx-operator#155

Reviewed-by: Elijah DeLee <kdelee@redhat.com>
Reviewed-by: Chris Meyers <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
2021-03-30 14:48:48 +00:00
sean-m-ssullivan
dde408ea1a update docs 2021-03-30 09:35:52 -05:00
softwarefactory-project-zuul[bot]
63798df06c Merge pull request #9748 from shanemcd/runner-2-alpha-1
Use Ansible Runner 2.0 alpha 1

Reviewed-by: Yanis Guenane <None>
2021-03-30 13:47:30 +00:00
Shane McDonald
54308c5fa1 Use Ansible Runner 2.0 alpha 1 2021-03-30 09:08:39 -04:00
softwarefactory-project-zuul[bot]
657f366e21 Merge pull request #9744 from shanemcd/fix-k8s-ca
Fix k8s credentials that use a custom ca cert

Reviewed-by: Elijah DeLee <kdelee@redhat.com>
2021-03-30 13:00:03 +00:00
sean-m-ssullivan
fce544bb73 add test logic 2021-03-29 22:14:06 -05:00
Shane McDonald
4beeeae9f1 Fix k8s credentials that use a custom ca cert 2021-03-29 17:49:50 -04:00
softwarefactory-project-zuul[bot]
8673631e64 Merge pull request #9742 from nixocio/ui_improve_ee_details
Add managed by tower as part of the EE details page

Add managed by tower as part of the EE details page.
See: #8171

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-29 21:42:21 +00:00
softwarefactory-project-zuul[bot]
3de04d33c8 Merge pull request #9743 from beeankha/fix_collections_linting_issues
Fix Collections Linting Errors (Format String Specifications)

Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-03-29 20:50:18 +00:00
beeankha
b1119d2972 Fix format specification linting erros 2021-03-29 16:11:06 -04:00
nixocio
ac41af8a54 Add managed by tower as part of the EE details page
Add managed by tower as part of the EE details page.

See: https://github.com/ansible/awx/issues/8171
2021-03-29 15:08:54 -04:00
softwarefactory-project-zuul[bot]
94eeea6c33 Merge pull request #9738 from beeankha/update_schedule_sort
Enable ?page_size=1 to Fetch Correct Objects on JT Endpoint

SUMMARY

Problem:
When multiple schedules are made from a single JT and a URL sort is done via:
api/v2/job_templates/[id]/schedules/?page_size=1
... the first half of the results come back with the same ID. 🤔
Solution:
Implementing a backup sort via ID on the schedules model fixes this problem, and now all schedules on the job template endpoint are being fetched properly.

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 18.0.0

ADDITIONAL INFORMATION

This might fix #9632

Reviewed-by: Seth Foster <None>
Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
2021-03-29 19:03:33 +00:00
Shane McDonald
b73759e380 Fix collection test 2021-03-29 15:03:28 -04:00
Shane McDonald
a5b29201a4 Update tests to use ee fixture 2021-03-29 14:45:21 -04:00
Shane McDonald
f80c2cbfc3 Delete test for unused code 2021-03-29 14:45:03 -04:00
Shane McDonald
3d533e5661 Fix container group OPTIONS request 2021-03-29 13:26:59 -04:00
Shane McDonald
91351f7e3b Fix default setting for KEEP_POD 2021-03-29 13:13:05 -04:00
Shane McDonald
9bc0bf0ee7 Fix inventory updates when running inside of k8s 2021-03-29 13:09:56 -04:00
Shane McDonald
9d17d40b86 Add setting for keeping container group pod after job run
Helpful for debugging
2021-03-29 13:09:31 -04:00
Shane McDonald
eeb6aaaea9 Always use EE resolving logic 2021-03-29 13:09:13 -04:00
Shane McDonald
1e9b221486 Use revolved EE for Container Group tasks 2021-03-29 13:05:57 -04:00
nixocio
115a344842 Add templates screen to EE
Add templates screen to EE.

See: https://github.com/ansible/awx/issues/9723
2021-03-29 12:44:37 -04:00
softwarefactory-project-zuul[bot]
03ab9f4e2a Merge pull request #9735 from jbradberry/update-docker-file-version
Update the versioning on the docker-compose template

SUMMARY
Some versions of docker-compose will break with the new addition of
name parameters without this.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

Installer

Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-03-29 16:15:27 +00:00
beeankha
675286c1ac Enable ?page_size=1 in URL to fetch correct objects on schedules endpoint 2021-03-29 11:52:20 -04:00
Jeff Bradberry
b6ccd02f3d Update the versioning on the docker-compose template
Some versions of docker-compose will break with the new addition of
name parameters without this.
2021-03-29 10:39:22 -04:00
softwarefactory-project-zuul[bot]
a2e63bd1e2 Merge pull request #9732 from shanemcd/fix-pdd-detection
Fix awxkit function that detects private data directories in job args

Reviewed-by: Yago Marques <yagomarquesja@gmail.com>
2021-03-29 13:46:32 +00:00
Shane McDonald
8fb393c0a1 Fix awxkit function that detects private data directories in job args 2021-03-29 09:11:56 -04:00
sean-m-ssullivan
c2b5ffcc1c linting 2021-03-29 00:21:29 -05:00
sean-m-ssullivan
dbcdbe0770 add logic to changed status 2021-03-28 22:35:38 -05:00
Sean Sullivan
0b6acdbcc9 Merge pull request #62 from ansible/devel
Rebase
2021-03-28 22:19:59 -05:00
softwarefactory-project-zuul[bot]
ba2fd6f801 Merge pull request #9725 from ryanpetrello/500-unauth-wf-approval
fix an HTTP 500 error for unauthenticated users

see: #7243

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-27 03:08:47 +00:00
softwarefactory-project-zuul[bot]
cd489262bc Merge pull request #9726 from shanemcd/nicer-black-output
Hide commands that are being run for `make black`

Before:
$ make black
command -v black >/dev/null 2>&1 || { echo "could not find black on your PATH, you may need to \`pip install black\`, or set AWX_IGNORE_BLACK=1" && exit 1; }
could not find black on your PATH, you may need to `pip install black`, or set AWX_IGNORE_BLACK=1
make: *** [Makefile:275: black] Error 1

After:
$ make black
could not find black on your PATH, you may need to `pip install black`, or set AWX_IGNORE_BLACK=1
make: *** [Makefile:275: black] Error 1

Reviewed-by: Ryan Petrello <None>
2021-03-26 21:47:43 +00:00
softwarefactory-project-zuul[bot]
950f772b49 Merge pull request #9722 from beeankha/remove_tower_cli
Remove/Modify Usage of tower-cli (Deprecated) in Collections Test

tower-cli is no longer being maintained; this PR removes three test tasks that are no longer necessary from awx_collection/tests/integration/targets/tower_project_manual/tasks/create_project_dir.yml, and it modifies the last task in that test file to use awx-cli instead.

I also noticed this warning while running Collections tests:
awx/main/tasks.py:2109
  /awx_devel/awx/main/tasks.py:2109: DeprecationWarning: invalid escape sequence \s
    d['Password:\s*?$'] = 'scm_password'  # noqa

This PR modifies that part of /awx_devel/awx/main/tasks.py into a raw string to fix this issue.

FYI, some deprecated Collections modules depend on the usage of tower-cli, but those tests are currently getting skipped:
awx_collection/test/awx/test_send_receive.py::test_receive_send_jt SKIPPED (The tower-cli library is needed to run th...) [ 56%]
awx_collection/test/awx/test_workflow_template.py::test_create_workflow_job_template SKIPPED (The tower-cli library i...) [ 73%]
awx_collection/test/awx/test_workflow_template.py::test_with_nested_workflow SKIPPED (The tower-cli library is needed...) [ 74%]
awx_collection/test/awx/test_workflow_template.py::test_schema_with_branches SKIPPED (The tower-cli library is needed...) [ 74%]
awx_collection/test/awx/test_workflow_template.py::test_with_missing_ujt SKIPPED (The tower-cli library is needed to ...) [ 75%]

Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Ryan Petrello <None>
2021-03-26 21:24:37 +00:00
Shane McDonald
eac7c409d1 Hide commands that are being run for make black 2021-03-26 17:11:04 -04:00
softwarefactory-project-zuul[bot]
ffdce7b1d0 Merge pull request #9724 from ryanpetrello/timey-whimey
fix up a bug in rsyslogd error handling

@kdelee I'm unclear on why this is actually happening, so I'm just gonna cheat and generate a datestring

Reviewed-by: Elijah DeLee <kdelee@redhat.com>
2021-03-26 21:02:18 +00:00
Ryan Petrello
6062d1ec9f fix an HTTP 500 error for unauthenticated users
see: https://github.com/ansible/awx/issues/7243
2021-03-26 16:40:48 -04:00
Ryan Petrello
4eb85ad23e fix up a bug in rsyslogd error handling
see: https://github.com/ansible/tower/issues/4915
2021-03-26 16:27:53 -04:00
beeankha
b681d1078f Update unit test to pull in product names that are no longer hardcoded 2021-03-26 16:17:14 -04:00
beeankha
f38c9e7478 Update manual project Collection integration test to be compatible with EEs 2021-03-26 15:35:52 -04:00
softwarefactory-project-zuul[bot]
f75a0ca1b6 Merge pull request #9713 from jakemcdermott/fix-9701
Don't append a slash to file paths

for #9701

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
2021-03-26 18:38:29 +00:00
beeankha
81024f8dfe Remove/modify usage of tower-cli in Collections tests 2021-03-26 11:46:08 -04:00
Jake McDermott
93d1df4e4b Use custom text for setting source path 2021-03-26 11:34:29 -04:00
Jake McDermott
a86196cfa3 Don't append a slash to file paths 2021-03-26 11:34:20 -04:00
softwarefactory-project-zuul[bot]
499d80c4b0 Merge pull request #9653 from nixocio/ui_issue_9088
Add EE to the settings page

Allow a system admin to set the global default execution environment.
See: #9088
This PR is also addressing the issue: #9669
Edit:


Details

Reviewed-by: Kersom <None>
Reviewed-by: Marliana Lara <marliana.lara@gmail.com>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-26 14:40:56 +00:00
softwarefactory-project-zuul[bot]
6aff5d9b5a Merge pull request #9697 from ryanpetrello/ansible-version
remove ansible_version from the API config and metrics endpoints

AWX no longer includes Ansible on the control plane and there is no
"global" version of Ansible aside from what's configured at the
Execution Environment level
see: #9472

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Ladislav Smola <lsmola@redhat.com>
Reviewed-by: Yanis Guenane <None>
Reviewed-by: Bianca Henderson <beeankha@gmail.com>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-25 21:33:53 +00:00
softwarefactory-project-zuul[bot]
db21b17ccd Merge pull request #9696 from dhoppe/patch-1
Set a custom name for Docker volumes

SUMMARY
This pull request is related to #9695 and will make sure that the command make docker-compose does not create additional Docker volumes with the wrong prefix.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

Installer

AWX VERSION
awx: 18.0.0

ADDITIONAL INFORMATION
The current version of docker-compose.yml.j2 does not care about the Docker volumes created during the execution of migrate.yml. This means new Docker volumes will be created with the wrong prefix, which only contain the preloaded data.
This does not make sense, because I want to keep my data and according to the docs, the following command is necessary to load the demo data.
$ docker exec tools_awx_1 awx-manage create_preload_data

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-03-25 20:57:56 +00:00
softwarefactory-project-zuul[bot]
dee8ed70cd Merge pull request #9711 from jladdjr/let_jupyter_install_ipython
let jupyter install ipython

running akit with ipython on py38:
In [1]: jt = v2.job_templates.create()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/usr/lib64/python3.8/codeop.py in __call__(self, source, filename, symbol)
    141
    142     def __call__(self, source, filename, symbol):
--> 143         codeob = compile(source, filename, symbol, self.flags, 1)
    144         for feature in _features:
    145             if codeob.co_flags & feature.compiler_flag:

TypeError: required field "type_ignores" missing from Module

Looks like we need a newer version of ipython:
ipython/ipython#12558 (comment)
.. because we pinned ipython in 2017
a39b1e8
If I try to install the newer ipython alongside jupyter, pip's dep resolver mentions a conflict
.. but if we just install jupyter there are no conflicts and a newer ipython (that avoids the original issue) gets installed.
pip freeze | grep "ipython\|jupyter"
ipython==7.21.0
ipython-genutils==0.2.0
jupyter==1.0.0
jupyter-client==6.1.12
jupyter-console==6.4.0
jupyter-core==4.7.1
jupyterlab-pygments==0.1.2
jupyterlab-widgets==1.0.0

In [1]: jt = v2.job_templates.create()

In [2]: jt
Out[2]:
{
    "id": 12,
    "type": "job_template",
    "url": "/api/v2/job_templates/12/",

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-03-25 20:56:27 +00:00
Jim Ladd
a1aec29e48 let jupyter install ipython 2021-03-25 13:17:21 -07:00
nixocio
d3eb66b6fe Update RBAC for EE
Update RBAC for EE details page.

See: https://github.com/ansible/awx/issues/9416
2021-03-25 15:55:59 -04:00
softwarefactory-project-zuul[bot]
6087d5cb9c Merge pull request #9461 from fosterseth/feat_metrics_via_redis
Add subsystem metrics that propagate through Redis

SUMMARY

#9019 -- list of metrics and their purpose / description
#9012
#9056
#8629
Use Redis to store metrics pertaining to the performance and health of subsystems such as the callback receiver and task manager. It is thread / multiprocess safe and should be fast enough to handle a high volume of data.
This data shows up at the /api/v2/metrics endpoint
You can filter down nodes using /api/v2/metrics/?subsystemonly=1&node=awx-1
You can also filter down to a specific metric,
/api/v2/metrics/?subsystemonly=1&metrics=callback_receiver_events_insert_db_seconds&node=awx-1

ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 17.0.1

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Chris Meyers <None>
Reviewed-by: Seth Foster <None>
Reviewed-by: Elijah DeLee <kdelee@redhat.com>
2021-03-25 19:54:21 +00:00
Seth Foster
0c569c67fd Add subsystem metrics
- Adds a Metrics() class that can track data such as number of
events the callback receiver inserted into database
- Exposes this metric data at the api/v2/metrics/ endpoint.
This data is prometheus-friendly
- Metric data is stored in memory, then periodically saved to Redis.
- Metric data is periodically broadcast to other nodes in the cluster,
so that each node has a copy of the most recent metric data collected.
2021-03-25 15:23:52 -04:00
Shane McDonald
f8a698d127 Update minikube.md 2021-03-25 15:21:01 -04:00
softwarefactory-project-zuul[bot]
b5c3857a63 Merge pull request #9551 from beeankha/loosen_collection_ver_check
Loosen Collections vs Tower Version Check

SUMMARY

Connecting issue #9532
This change will make it so that if the major version numbers of Collections + Tower matches, a warning will not get activated.

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


Collections

AWX VERSION

awx: 17.0.1

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Jeff Bradberry <None>
Reviewed-by: John Westcott IV <None>
2021-03-25 19:10:07 +00:00
softwarefactory-project-zuul[bot]
690045c8e0 Merge pull request #9671 from fosterseth/fix_4602_pending_jobs_incorrect_metrics
Fix api/v2/metrics data displaying incorrect value

SUMMARY

How to reproduce bug

Disable all instances
Queue up 5 jobs, (if using same JT, enable concurrent jobs)
Enable instance so jobs will start running
Refresh /api/v2/metrics endpoint. You should see a metric that says awx_status_total{status="pending"} 5.0. Once you see this, don't refresh again.
Wait for all jobs to finish.
Now start refreshing the api/v2/metrics endpoint. Every once in a while you will see this pending jobs metric show (awx_status_total{status="pending"} 5.0) even though there are no jobs in pending state

Fix
Use a locally defined prometheus registry instead of a global registry. Each time the endpoint is refreshed, a new, local registry is set up with prometheus objects (Gauge, Info). Since we aren't actually incrementing these metrics across api calls, we should be safe. That is to say, we just lookup the values from the database and set the prometheus values explicitly.

ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 18.0.0

Reviewed-by: Ryan Petrello <None>
2021-03-25 19:10:04 +00:00
softwarefactory-project-zuul[bot]
874505e2a3 Merge pull request #9707 from shanemcd/quay
Devel images are now on Quay

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Jim Ladd <None>
2021-03-25 19:04:19 +00:00
Seth Foster
3f342feadd Fix api/v2/metrics data displaying incorrect value
- Use a locally defined prometheus registry instead of global registry
2021-03-25 14:22:17 -04:00
softwarefactory-project-zuul[bot]
f46c968742 Merge pull request #9706 from ryanpetrello/black-deleted
only run black on files added or modified in the commit

git rm <somefile>
git commit

black will attempt to lint the file path to the deleted file (and will fail, because the file is gone)
--diff-filter will limit what we run listing against to files in the changes that are added or modified
https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203

Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
2021-03-25 18:00:05 +00:00
beeankha
cdb2832f05 Bump up version of iPython to be compatible with Python 3.8.5 2021-03-25 13:50:02 -04:00
Shane McDonald
8bb90dde33 Devel images are now on Quay 2021-03-25 13:27:19 -04:00
softwarefactory-project-zuul[bot]
fa3e55be91 Merge pull request #9588 from AlexSCorey/9456-9466-UserAndTeamsAccessAdd
Fixes a bug with ResourceAccess Add

SUMMARY
This addresses #9456 and #9466
The user can now properly add roles to a resource.
ISSUE TYPE

Bugfix Pull Request

COMPONENT NAME

UI

ADDITIONAL INFORMATION

Reviewed-by: Kersom <None>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-25 17:26:23 +00:00
Ryan Petrello
81266cf7a7 only run black on files added or modified in the commit 2021-03-25 13:26:14 -04:00
nixocio
b110a4a94e Add EE to the settings page
Allow a system admin to set the global default execution environment.

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

This PR is also addressing the issue: https://github.com/ansible/awx/issues/9669
2021-03-25 13:07:01 -04:00
softwarefactory-project-zuul[bot]
d286a77010 Merge pull request #9699 from nixocio/ui_small_fixes
Small UI updates

Small UI updates

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-25 17:04:50 +00:00
softwarefactory-project-zuul[bot]
a7992d06e3 Merge pull request #9659 from jakemcdermott/fix-7657
Support job cancellation through details panel

SUMMARY
for #7657
edit: also addresses #8838 cc @nixocio

Reviewed-by: Kersom <None>
Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-25 16:58:03 +00:00
softwarefactory-project-zuul[bot]
705881123c Merge pull request #9345 from AlexSCorey/5546-DeleteWarnings
Adds delete warnings on lists

SUMMARY
This addresses #5546.
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

UI

AWX VERSION
ADDITIONAL INFORMATION

Reviewed-by: Keith Grant <None>
Reviewed-by: Alex Corey <Alex.swansboro@gmail.com>
Reviewed-by: Kersom <None>
2021-03-25 16:52:13 +00:00
Ryan Petrello
db20bbe682 remove ansible_version from the API config and metrics endpoints
AWX no longer includes Ansible on the control plane and there is no
"default" version of Ansible aside from what's configured at the
Execution Environment level

see: https://github.com/ansible/awx/issues/9472
2021-03-25 11:09:47 -04:00
John Westcott IV
75a99bb1d5 Fixing version check 2021-03-25 10:56:34 -04:00
John Westcott IV
aa9906ebae Fixing issues 2021-03-25 10:39:03 -04:00
John Westcott IV
bb43ecb0b5 Splitting out AWX and Tower versions 2021-03-25 10:39:03 -04:00
beeankha
e2b290ff99 Use distutils instead of semver, add/update unit tests 2021-03-25 10:39:03 -04:00
beeankha
b2665c084e Loosen Collections v Tower version check 2021-03-25 10:39:03 -04:00
nixocio
133b25d6ad Small UI updates
Small UI updates
2021-03-25 10:17:55 -04:00
softwarefactory-project-zuul[bot]
ecc839169a Merge pull request #9670 from ryanpetrello/burst-your-bubble
remove unnecessary references to bwrap, bubblewrap, and proot

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Ryan Petrello <None>
Reviewed-by: Bill Nottingham <None>
Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-03-25 13:55:22 +00:00
Dennis Hoppe
9390452f02 Set a custom name for Docker volumes 2021-03-25 12:51:05 +01:00
softwarefactory-project-zuul[bot]
ef691507b3 Merge pull request #9690 from ryanpetrello/relnotes-next
Add some release notes for the next major version of AWX

Reviewed-by: Yanis Guenane <None>
2021-03-25 08:43:52 +00:00
softwarefactory-project-zuul[bot]
11563e8333 Merge pull request #9691 from ryanpetrello/38-requirements
build requirements with python3.8

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Yanis Guenane <None>
2021-03-25 08:41:37 +00:00
Ryan Petrello
4773c54bf2 build requirements with python3.8 2021-03-24 21:47:55 -04:00
Ryan Petrello
5d210a1063 remove unnecessary references to bwrap, bubblewrap, and proot 2021-03-24 21:20:08 -04:00
Ryan Petrello
97ae4ec250 Add some release notes for the next major version of AWX 2021-03-24 21:19:27 -04:00
softwarefactory-project-zuul[bot]
73cc9e7b35 Merge pull request #9688 from ryanpetrello/fix-busted-collection-pep8
fix busted pep8 collection tests

see: psf/black#1841

Reviewed-by: Elijah DeLee <kdelee@redhat.com>
Reviewed-by: Matt Clay <None>
2021-03-24 21:59:43 +00:00
softwarefactory-project-zuul[bot]
2b965e5523 Merge pull request #8778 from Spredzy/bump_to_python38
Python: Bump to python 3.8

SUMMARY
Bumping default python used in awx and ansible venv to python 3.8
ISSUE TYPE

Feature Pull Request

COMPONENT NAME

API

AWX VERSION

devel

ADDITIONAL INFORMATION

N/A

Reviewed-by: Ryan Petrello <None>
Reviewed-by: Bill Nottingham <None>
Reviewed-by: Yanis Guenane <None>
2021-03-24 21:41:32 +00:00
Ryan Petrello
9d9b7a226d fix busted pep8 collection tests
see: https://github.com/psf/black/issues/1841
2021-03-24 17:28:04 -04:00
Yanis Guenane
5544e84f79 Add missing license for distro 2021-03-24 22:10:53 +01:00
softwarefactory-project-zuul[bot]
41e2920211 Merge pull request #9682 from ryanpetrello/custom-cred-open-ssh-newline
fix a bug that improperly formats OpenSSH keys in custom credential types

cc @ghjm
see: #9361

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
2021-03-24 20:07:08 +00:00
Yanis Guenane
6d8874d627 Fix test issues 2021-03-24 21:02:33 +01:00
Yanis Guenane
e04e4e8c85 Python: Bump to python 3.8 2021-03-24 21:02:32 +01:00
Keith J. Grant
fb257d0add add ouia ids to variables expand buttons 2021-03-24 13:00:28 -07:00
Sean Sullivan
a378e897ad Merge pull request #56 from ansible/devel
Rebase
2021-03-24 13:29:15 -05:00
softwarefactory-project-zuul[bot]
23d72a9b6c Merge pull request #9201 from amolgautam25/issue_5057
Properly set launched_by for jobs launched by scheduled workflows : Issue 5057

SUMMARY

with respect to the issue 5057, there should be a way by which the UI should know , if a job was launched from a workflow , and that workflow was launched from a schedule.

ISSUE TYPE


Feature Pull Request

COMPONENT NAME


API

AWX VERSION

awx: 17.0.1

ADDITIONAL INFORMATION


This PR tries to solve the issue 5057. 
There is an edge case , where the API response is not very clear. When a JT is invoked from a workflow , and that workflow is invoked from a schedule, the API response does not convey how the job was launched. 

So, I have added the schedule id of the schedule that invoked the workflow and which in turn invokes the JT. The new key in API response is 'launched_by', and it has the schedule id. In all  the 5 previous cases mentioned in the initial issue , the 'launched_by' field is blank ( that is empty string ( "" )).

Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Ryan Petrello <None>
Reviewed-by: Elijah DeLee <kdelee@redhat.com>
Reviewed-by: Amol Gautam <amol_gautam25@yahoo.co.in>
Reviewed-by: Nana  <natr@hey.com>
2021-03-24 17:48:39 +00:00
fedora
e7e18b854f Added ‘launched_by’ property and ‘ancestor_job’ property in UnifiedJob class
'launched_by’ property returns summary  { id,type,name,url } of object that launched the current UnifiedJob
'ancestor_job’ property returns summary { id,type,name,url } of the first workflow in case the current UnifiedJob was started by a workflow or a workflow chain
Added ‘launched_by’ field and ‘get_launched_by’ function in ‘UnifiedJobSerializer’ , to expose the ‘launched_by’ field in GET ‘api/v2/unified_job/id’ response
Added ‘ancestor_job’ field in the summary field of UnifiedJob in the GET ‘api/v2/unified_job/id’ response
2021-03-24 13:12:23 -04:00
softwarefactory-project-zuul[bot]
633f5419e0 Merge pull request #9684 from ryanpetrello/black-help-message
add a helpful error message for people who want to run `make black`

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-03-24 16:48:56 +00:00
Ryan Petrello
1d1630bc1c add a helpful error message for people who want to run make black 2021-03-24 12:13:05 -04:00
Ryan Petrello
48f4e6dd23 fix a bug that improperly formats OpenSSH keys in custom credential types 2021-03-24 10:18:25 -04:00
softwarefactory-project-zuul[bot]
634d432de4 Merge pull request #9627 from jainnikhil30/fix_large_file_project_sync
fix the large file parsing in project sync

SUMMARY
Fixes the issue of scm update stuck on reading large files because of islice trying to read the whole file.
ISSUE TYPE


Bugfix Pull Request

COMPONENT NAME


API

Reviewed-by: Ryan Petrello <None>
Reviewed-by: None <None>
2021-03-24 13:46:00 +00:00
Jordan Borean
b222f10d68 Missed ErrorAction in the params 2021-03-24 12:21:50 +10:00
Jordan Borean
1b6cfd803c Fix up request tower ps script 2021-03-24 12:12:02 +10:00
Nikhil Jain
60d6832971 fix the large file parsing in project sync 2021-03-23 15:17:47 -04:00
Alex Corey
06ce1c2a92 adds instance group warnings 2021-03-23 15:03:22 -04:00
Jake McDermott
72d700e125 Use the type-specific job models
Add the expected launch and run methods to the different job type
models. Include a new helper function to look up the right model
given a job type and use it in place of switch statements or
passing the type in to build a url.
2021-03-23 15:02:27 -04:00
Jake McDermott
a706eb608a Support job cancellation through details panel 2021-03-23 14:48:50 -04:00
softwarefactory-project-zuul[bot]
646c9cc708 Merge pull request #9639 from nixocio/ui_issue_9628
Filter credential type by Container Registry for EE

Filter credential type by Container Registry for EE form.
See: #9628

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Kersom <None>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-23 16:22:49 +00:00
softwarefactory-project-zuul[bot]
e042abbbb3 Merge pull request #9656 from nixocio/ui_issue_9308
Add EE as one activity stream option

Add EE as one activity stream option.
See: #9308

Reviewed-by: Jake McDermott <yo@jakemcdermott.me>
Reviewed-by: Tiago Góes <tiago.goes2009@gmail.com>
2021-03-23 16:18:28 +00:00
softwarefactory-project-zuul[bot]
3538974c8a Merge pull request #9666 from ryanpetrello/more-18-changes
a few changelog modifications for 18.0.0

Reviewed-by: Shane McDonald <me@shanemcd.com>
2021-03-23 16:07:41 +00:00
softwarefactory-project-zuul[bot]
9a61c43687 Merge pull request #9664 from jakemcdermott/fix-cred-plugin-dev
Fix service reference error for cred plugin dev env

SUMMARY
Intended to fix the error I see when running COMPOSE_TAG=devel make docker-compose-credential-plugins:

Reviewed-by: Ryan Petrello <None>
2021-03-23 15:55:00 +00:00
softwarefactory-project-zuul[bot]
f2876b9ac5 Merge pull request #9634 from ryanpetrello/black
move code linting to a stricter pep8-esque auto-formatting tool, black

black (https://pypi.org/project/black/#description) is a strict superset of PEP8
It's also a tool that auto-formats your code on the fly for you based on its ruleset.
With this PR, you can run make check, and any style issues will automatically be applied.
Additionally, with this PR, if you spin up the development environment using our make targets, you'll automatically get a pre-commit hook installed that automatically runs linting prior to commit.
If you don't like this behavior, or don't want it locally, you can:
~ export AWX_IGNORE_BLACK=1
...but it's important to note that we won't merge your PR if it doesn't adhere to our style guidelines (which will run automatically as part of pre-merge CI).

Reviewed-by: Jeff Bradberry <None>
Reviewed-by: Ryan Petrello <None>
Reviewed-by: Christian Adams <rooftopcellist@gmail.com>
Reviewed-by: Seth Foster <None>
Reviewed-by: Shane McDonald <me@shanemcd.com>
Reviewed-by: Rebeccah Hunter <rhunter@redhat.com>
2021-03-23 15:54:55 +00:00
Ryan Petrello
2799d09d55 add a CHANGELOG note about the move to Quay 2021-03-23 11:23:59 -04:00
Ryan Petrello
9811e65921 a few changelog modifications for 18.0.0 2021-03-23 10:57:47 -04:00
Alex Corey
652e7a500b adds counts for inventory groups and hosts that are related to an inventory source 2021-03-23 10:41:08 -04:00
Alex Corey
be148b5fd4 Adds more execution environment resource to delete warnings 2021-03-23 10:41:08 -04:00
Alex Corey
6e401fa02f fixes credential type delete warnings 2021-03-23 10:41:08 -04:00
Alex Corey
c2e224bb86 adds tests 2021-03-23 10:41:08 -04:00
Alex Corey
7e7bb5261b Adds delete warnings on the lists and detail pages that have resources that are used by other resources 2021-03-23 10:33:28 -04:00
Shane McDonald
14f42af700 Update CHANGELOG.md 2021-03-23 10:30:59 -04:00
Ryan Petrello
f6beb7105d add the ability to ignore black linting on commit with AWX_IGNORE_BLACK 2021-03-23 10:18:43 -04:00
Ryan Petrello
244d9e70e2 reformat some code with black after rebasing 2021-03-23 10:03:52 -04:00
Ryan Petrello
b2cf45820e automatically add a dev environment pre-commit hook to run code linting 2021-03-23 10:03:48 -04:00
Alex Corey
4f257655a9 allows proper submission of roles 2021-03-23 10:00:26 -04:00
Ryan Petrello
7200cbc94a move black CLI arguments into a pyproject.toml 2021-03-23 09:40:00 -04:00
Ryan Petrello
c2ef0a6500 move code linting to a stricter pep8-esque auto-formatting tool, black 2021-03-23 09:39:58 -04:00
Jake McDermott
201c3f56e7 Fix service reference error for cred plugin dev env 2021-03-23 09:20:42 -04:00
nixocio
87d51c1038 Filter credential type by Container Registry for EE
Filter credential type by Container Registry for EE form.

See: https://github.com/ansible/awx/issues/9628
2021-03-22 16:13:04 -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
nixocio
e45c3fb8e9 Add EE as one activity stream option
Add EE as one activity stream option.

See: https://github.com/ansible/awx/issues/9308
2021-03-22 15:02:35 -04: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
Keith J. Grant
e8886a5525 fix InventoryGroupDetails test 2021-03-15 11:42:09 -07:00
Shane McDonald
876d4316e1 Fix collection tests 2021-03-15 14:14:03 -04:00
Keith J. Grant
659f68f280 add VariablesField expand test 2021-03-15 10:56:30 -07:00
Keith J. Grant
f867c9e476 fix type errors in VariablesDetail 2021-03-15 10:56:21 -07:00
Keith J. Grant
d6a5a1e0d0 add expand button to VariablesDetail 2021-03-15 10:55:42 -07:00
Keith J. Grant
b1ce5e24e3 add expand button to VariablesField 2021-03-15 10:55:31 -07: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
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
Marliana Lara
ccd39a60db Show workflow template notification list approval toggle 2020-12-09 15:25:26 -05:00
mabashian
86d289c375 Adds dataCy id's to app/token details 2020-12-08 14:26:36 -05: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
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
Jake McDermott
05ae6df80b Avoid prop reference error when saving cred 2020-12-08 10:36:06 -05:00
Marliana Lara
8d6a6198dc Add Google OAuth 2.0 setting edit form 2020-12-07 15:33:00 -05:00
sean-m-sullivan
bbed8ec704 add update to tower project 2020-11-25 09:36:03 -06:00
Sean Sullivan
318274c70f Merge pull request #22 from ansible/devel
Rebase
2020-11-25 09:36:11 -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
1996 changed files with 178327 additions and 85020 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

View File

@@ -23,8 +23,8 @@ https://www.ansible.com/security
##### ENVIRONMENT
* AWX version: X.Y.Z
* AWX install method: openshift, minishift, docker on linux, docker for mac, boot2docker
* Ansible version: X.Y.Z
* AWX install method: operator, developer environment
* AWX deployment target: openshift, kubernetes, minikube
* Operating System:
* Web Browser:

View File

@@ -17,7 +17,6 @@ the change does.
<!--- Name of the module/plugin/module/task -->
- API
- UI
- Installer
##### AWX VERSION
<!--- Paste verbatim output from `make VERSION` between quotes below -->

16
.gitignore vendored
View File

@@ -29,13 +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
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
@@ -86,6 +91,9 @@ awx/awx_test.sqlite3-journal
# Mac OS X
*.DS_Store
# VSCode
.vscode/
# Editors
*.sw[poj]
*~
@@ -145,4 +153,8 @@ use_dev_supervisor.txt
.idea/*
*.unison.tmp
*.#
/tools/docker-compose/overrides/
/awx/ui_next/.ui-built
/Dockerfile
/_build/
/_build_kube_dev/
/Dockerfile.kube-dev

View File

@@ -1,7 +1,7 @@
Coding Standards and Practices
==============================
This is not meant to be a style document so much as a practices document for ensuring performance and convention in the Ansible Tower API.
This is not meant to be a style document so much as a practices document for ensuring performance and convention in the AWX API.
Paginate Everything
===================

View File

@@ -2,6 +2,131 @@
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>`.
# 19.2.0 (June 1, 2021)
- Fixed race condition that would sometimes cause jobs to error out at the very end of an otherwise successful run (https://github.com/ansible/receptor/pull/328)
- Fixes bug where users were unable to click on text next to checkboxes in modals (https://github.com/ansible/awx/pull/10279)
- Have the project update playbook warn if role/collection syncing is disabled. (https://github.com/ansible/awx/pull/10068)
- Move irc references to point to irc.libera.chat (https://github.com/ansible/awx/pull/10295)
- Fixes bug where activity stream changes were displaying as [object object] (https://github.com/ansible/awx/pull/10267)
- Update awxkit to enable export of Galaxy credentials associated to organizations (https://github.com/ansible/awx/pull/10271)
- Bump receptor and receptorctl versions to 1.0.0a2 (https://github.com/ansible/awx/pull/10261)
- Add the ability to disable local authentication (https://github.com/ansible/awx/pull/10102)
- Show error if no Execution Environment is found on project sync/job run (https://github.com/ansible/awx/pull/10183)
- Allow for editing and deleting managed_by_tower EEs from API/UI (https://github.com/ansible/awx/pull/10173)
# 19.1.0 (May 1, 2021)
- Custom inventory scripts have been removed from the API https://github.com/ansible/awx/pull/9822
- Old scripts can be exported via `awx-manage export_custom_scripts`
- Fixed a bug where ad-hoc commands targeted against multiple hosts would run against only 1 host https://github.com/ansible/awx/pull/9973
- AWX will now look for a top-level requirements.yml when installing collections / roles in project updates https://github.com/ansible/awx/pull/9945
- Improved error handling when Container Group pods fail to launch https://github.com/ansible/awx/pull/10025
- Added ability to set server-side password policies using Django's AUTH_PASSWORD_VALIDATORS setting https://github.com/ansible/awx/pull/9999
- Bumped versions of Ansible Runner & AWX EE https://github.com/ansible/awx/pull/10013
- If you have built any custom EEs on top of awx-ee 0.1.0, you will need to rebuild on top of 0.2.0.
- Remove legacy resource profiling code https://github.com/ansible/awx/pull/9883
# 19.0.0 (April 7, 2021)
- AWX now runs on Python 3.8 (https://github.com/ansible/awx/pull/8778/)
- Fixed inventories-from-projects when running in Kubernetes (https://github.com/ansible/awx/pull/9741)
- Fixed a bug where a slash was appended to invetory file paths in UI dropdown (https://github.com/ansible/awx/pull/9713)
- Fix a bug with large file parsing in project sync (https://github.com/ansible/awx/pull/9627)
- Fix k8s credentials that use a custom ca cert (https://github.com/ansible/awx/pull/9744)
- Fix a bug that allowed a user to attempt deleting a running job (https://github.com/ansible/awx/pull/9758)
- Fixed the Kubernetes Pod reaper to properly delete Pods launched by Receptor (https://github.com/ansible/awx/pull/9819)
- AWX Collection Modules: added ability to set instance groups for organization, job templates, and inventories. (https://github.com/ansible/awx/pull/9804)
- Fixed CSP violation errors on job details and job settings views (https://github.com/ansible/awx/pull/9818)
- Added support for convergence any/all on workflow nodes (https://github.com/ansible/awx/pull/9737)
- Fixed race condition that causes InvalidGitRepositoryError (https://github.com/ansible/awx/pull/9754)
- Added support for Execution Environments to the Activity Stream (https://github.com/ansible/awx/issues/9308)
- Fixed a bug that improperly formats OpenSSH keys specified in custom Credential Types (https://github.com/ansible/awx/issues/9361)
- Fixed an HTTP 500 error for unauthenticated users (https://github.com/ansible/awx/pull/9725)
- Added subscription wizard: https://github.com/ansible/awx/pull/9496
# 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](https://github.com/ansible/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). Official images for Operator-based installs are no longer hosted on Docker Hub, but are instead available on [Quay](https://quay.io/repository/ansible/awx?tab=tags).
- 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 support for Centrify Vault (https://www.centrify.com) as a credential lookup plugin (https://github.com/ansible/awx/pull/9542)
- Added support for namespaces in Hashicorp Vault credential plugin (https://github.com/ansible/awx/pull/9590)
- 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

View File

@@ -2,7 +2,7 @@
Hi there! We're excited to have you as a contributor.
Have questions about this document or anything not covered here? Come chat with us at `#ansible-awx` on irc.freenode.net, or submit your question to the [mailing list](https://groups.google.com/forum/#!forum/awx-project).
Have questions about this document or anything not covered here? Come chat with us at `#ansible-awx` on irc.libera.chat, or submit your question to the [mailing list](https://groups.google.com/forum/#!forum/awx-project).
## Table of contents
@@ -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
@@ -37,12 +28,12 @@ Have questions about this document or anything not covered here? Come chat with
- You must use `git commit --signoff` for any commit to be merged, and agree that usage of --signoff constitutes agreement with the terms of [DCO 1.1](./DCO_1_1.md).
- Take care to make sure no merge commits are in the submission, and use `git rebase` vs `git merge` for this reason.
- If collaborating with someone else on the same branch, consider using `--force-with-lease` instead of `--force`. This will prevent you from accidentally overwriting commits pushed by someone else. For more information, see https://git-scm.com/docs/git-push#git-push---force-with-leaseltrefnamegt
- If submitting a large code change, it's a good idea to join the `#ansible-awx` channel on irc.freenode.net, and talk about what you would like to do or add first. This not only helps everyone know what's going on, it also helps save time and effort, if the community decides some changes are needed.
- If submitting a large code change, it's a good idea to join the `#ansible-awx` channel on irc.libera.chat, and talk about what you would like to do or add first. This not only helps everyone know what's going on, it also helps save time and effort, if the community decides some changes are needed.
- We ask all of our community members and contributors to adhere to the [Ansible code of conduct](http://docs.ansible.com/ansible/latest/community/code_of_conduct.html). If you have questions, or need assistance, please reach out to our community team at [codeofconduct@ansible.com](mailto:codeofconduct@ansible.com)
## 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
@@ -304,7 +114,7 @@ Fixing bugs, adding translations, and updating the documentation are always appr
**NOTE**
> If you work in a part of the codebase that is going through active development, your changes may be rejected, or you may be asked to `rebase`. A good idea before starting work is to have a discussion with us in the `#ansible-awx` channel on irc.freenode.net, or on the [mailing list](https://groups.google.com/forum/#!forum/awx-project).
> If you work in a part of the codebase that is going through active development, your changes may be rejected, or you may be asked to `rebase`. A good idea before starting work is to have a discussion with us in the `#ansible-awx` channel on irc.libera.chat, or on the [mailing list](https://groups.google.com/forum/#!forum/awx-project).
**NOTE**
@@ -317,7 +127,7 @@ Fixes and Features for AWX will go through the Github pull request process. Subm
Here are a few things you can do to help the visibility of your change, and increase the likelihood that it will be accepted:
* No issues when running linters/code checkers
* Python: flake8: `(container)/awx_devel$ make flake8`
* Python: black: `(container)/awx_devel$ make black`
* Javascript: JsHint: `(container)/awx_devel$ make jshint`
* No issues from unit tests
* Python: py.test: `(container)/awx_devel$ make test`
@@ -326,7 +136,7 @@ Here are a few things you can do to help the visibility of your change, and incr
* Make the smallest change possible
* Write good commit messages. See [How to write a Git commit message](https://chris.beams.io/posts/git-commit/).
It's generally a good idea to discuss features with us first by engaging us in the `#ansible-awx` channel on irc.freenode.net, or on the [mailing list](https://groups.google.com/forum/#!forum/awx-project).
It's generally a good idea to discuss features with us first by engaging us in the `#ansible-awx` channel on irc.libera.chat, or on the [mailing list](https://groups.google.com/forum/#!forum/awx-project).
We like to keep our commit history clean, and will require resubmission of pull requests that contain merge commits. Use `git pull --rebase`, rather than
`git pull`, and `git rebase`, rather than `git merge`.
@@ -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,644 +1,24 @@
Table of Contents
=================
* [Installing AWX](#installing-awx)
* [The AWX Operator](#the-awx-operator)
* [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)
## Getting started
### Clone the repo
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:
https://github.com/ansible/awx/releases
...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 14.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
```
dockerhub_base=ansible
dockerhub_version=latest
```
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.
*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`:
```
admin_password: 'adminpass'
pg_password: 'pgpass'
secret_key: 'mysupersecret'
```
And pass it to the installer:
```
$ ansible-playbook -i inventory install.yml -e @vars.yml
```
## OpenShift
### 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
```
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
```
You will see the following indicating that database migrations are running:
```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
...
```
When you see output similar to the following, you'll know that database migrations have completed, and you can access the web interface:
```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-3886581826-5mv0l
(changed: True)
Creating instance group tower
Added instance awx-3886581826-5mv0l to tower
```
Once database migrations complete, the web interface will be accessible.
### 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
```
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:
```bash
# View available routes
$ oc get routes
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
```
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).
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`.
## 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
```
### 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`.
Starting in version 18.0, the [AWX Operator](https://github.com/ansible/awx-operator) is the preferred way to install AWX. Please refer to the [AWX Operator](https://github.com/ansible/awx-operator) documentation.
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.
# Installing the AWX CLI

View File

@@ -5,7 +5,7 @@
Use the GitHub [issue tracker](https://github.com/ansible/awx/issues) for filing bugs. In order to save time, and help us respond to issues quickly, make sure to fill out as much of the issue template
as possible. Version information, and an accurate reproducing scenario are critical to helping us identify the problem.
Please don't use the issue tracker as a way to ask how to do something. Instead, use the [mailing list](https://groups.google.com/forum/#!forum/awx-project) , and the `#ansible-awx` channel on irc.freenode.net to get help.
Please don't use the issue tracker as a way to ask how to do something. Instead, use the [mailing list](https://groups.google.com/forum/#!forum/awx-project) , and the `#ansible-awx` channel on irc.libera.chat to get help.
Before opening a new issue, please use the issue search feature to see if what you're experiencing has already been reported. If you have any extra detail to provide, please comment. Otherwise, rather than posting a "me too" comment, please consider giving it a ["thumbs up"](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comment) to give us an indication of the severity of the problem.

View File

@@ -20,7 +20,7 @@ recursive-exclude awx/ui/client *
recursive-exclude awx/settings local_settings.py*
include tools/scripts/request_tower_configuration.sh
include tools/scripts/request_tower_configuration.ps1
include tools/scripts/ansible-tower-service
include tools/scripts/automation-controller-service
include tools/scripts/failure-event-handler
include tools/scripts/awx-python
include awx/playbooks/library/mkfifo.py

306
Makefile
View File

@@ -1,4 +1,4 @@
PYTHON ?= python3
PYTHON ?= python3.8
PYTHON_VERSION = $(shell $(PYTHON) -c "from distutils.sysconfig import get_python_version; print(get_python_version())")
SITELIB=$(shell $(PYTHON) -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")
OFFICIAL ?= no
@@ -13,23 +13,24 @@ MANAGEMENT_COMMAND ?= awx-manage
IMAGE_REPOSITORY_AUTH ?=
IMAGE_REPOSITORY_BASE ?= https://gcr.io
VERSION := $(shell cat VERSION)
PYCURL_SSL_LIBRARY ?= openssl
# NOTE: This defaults the container image version to the branch that's active
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
DEV_DOCKER_TAG_BASE ?= quay.io/awx
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
SRC_ONLY_PKGS ?= cffi,pycparser,psycopg2,twilio
# These should be upgraded in the AWX and Ansible venv before attempting
# to install the actual requirements
VENV_BOOTSTRAP ?= pip==19.3.1 setuptools==41.6.0
VENV_BOOTSTRAP ?= pip==19.3.1 setuptools==41.6.0 wheel==0.36.2
# Determine appropriate shasum command
UNAME_S := $(shell uname -s)
@@ -59,11 +60,12 @@ WHEEL_FILE ?= $(WHEEL_NAME)-py2-none-any.whl
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
dev_build release_build sdist \
ui-release ui-devel \
VERSION docker-compose-sources \
.git/hooks/pre-commit
clean-tmp:
rm -rf tmp/
@@ -112,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
@@ -147,37 +125,11 @@ virtualenv_awx:
mkdir $(VENV_BASE); \
fi; \
if [ ! -d "$(VENV_BASE)/awx" ]; then \
virtualenv -p $(PYTHON) $(VENV_BASE)/awx; \
$(PYTHON) -m venv $(VENV_BASE)/awx; \
$(VENV_BASE)/awx/bin/pip install $(PIP_OPTIONS) $(VENV_BOOTSTRAP); \
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
@@ -191,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
@@ -220,7 +164,7 @@ version_file:
if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
python -c "import awx; print(awx.__version__)" > /var/lib/awx/.awx_version; \
$(PYTHON) -c "import awx; print(awx.__version__)" > /var/lib/awx/.awx_version; \
# Do any one-time init tasks.
comma := ,
@@ -229,12 +173,7 @@ init:
. $(VENV_BASE)/awx/bin/activate; \
fi; \
$(MANAGEMENT_COMMAND) provision_instance --hostname=$(COMPOSE_HOST); \
$(MANAGEMENT_COMMAND) register_queue --queuename=tower --instance_percent=100;\
if [ "$(AWX_GROUP_QUEUES)" == "tower,thepentagon" ]; then \
$(MANAGEMENT_COMMAND) provision_instance --hostname=isolated; \
$(MANAGEMENT_COMMAND) register_queue --queuename='thepentagon' --hostnames=isolated --controller=tower; \
$(MANAGEMENT_COMMAND) generate_isolated_key > /awx_devel/awx/main/isolated/authorized_keys; \
fi;
$(MANAGEMENT_COMMAND) register_queue --queuename=tower --instance_percent=100;
# Refresh development environment after pulling new code.
refresh: clean requirements_dev version_file develop migrate
@@ -266,11 +205,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 \
@@ -311,20 +266,15 @@ jupyter:
reports:
mkdir -p $@
pep8: reports
@(set -o pipefail && $@ | tee reports/$@.report)
black: reports
@command -v black >/dev/null 2>&1 || { echo "could not find black on your PATH, you may need to \`pip install black\`, or set AWX_IGNORE_BLACK=1" && exit 1; }
@(set -o pipefail && $@ $(BLACK_ARGS) awx awxkit awx_collection | tee reports/$@.report)
flake8: reports
@if [ "$(VENV_BASE)" ]; then \
. $(VENV_BASE)/awx/bin/activate; \
fi; \
(set -o pipefail && $@ | tee reports/$@.report)
pyflakes: reports
@(set -o pipefail && $@ | tee reports/$@.report)
pylint: reports
@(set -o pipefail && $@ | reports/$@.report)
.git/hooks/pre-commit:
@echo "if [ -x pre-commit.sh ]; then" > .git/hooks/pre-commit
@echo " ./pre-commit.sh;" >> .git/hooks/pre-commit
@echo "fi" >> .git/hooks/pre-commit
@chmod +x .git/hooks/pre-commit
genschema: reports
$(MAKE) swagger PYTEST_ARGS="--genschema --create-db "
@@ -336,11 +286,11 @@ swagger: reports
fi; \
(set -o pipefail && py.test $(PYTEST_ARGS) awx/conf/tests/functional awx/main/tests/functional/api awx/main/tests/docs --release=$(VERSION_TARGET) | tee reports/$@.report)
check: flake8 pep8 # pyflakes pylint
check: black
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
[ -d "/awx_devel/awx.egg-info" ] || $(PYTHON) /awx_devel/setup.py egg_info_dev
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
@@ -364,17 +314,15 @@ 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
# Second we will load any libraries out of the virtualenv (if it's unspecified that should be ok because python should not load out of an empty directory)
# Finally we will add the system path so that the tests can find the ansible libraries
flake8_collection:
flake8 awx_collection/ # Different settings, in main exclude list
test_collection_all: test_collection flake8_collection
test_collection_all: test_collection
# WARNING: symlinking a collection is fundamentally unstable
# this is for rapid development iteration with playbooks, do not use with other test targets
@@ -426,68 +374,49 @@ 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
# UI TASKS
# --------------------------------------
awx/ui_next/node_modules:
$(NPM_BIN) --prefix awx/ui_next install
UI_BUILD_FLAG_FILE = awx/ui_next/.ui-built
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)
ui-release: ui-devel
ui-devel: 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
git checkout awx/ui_next/src/locales
awx/ui_next/node_modules:
NODE_OPTIONS=--max-old-space-size=4096 $(NPM_BIN) --prefix awx/ui_next --loglevel warn ci
$(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 $@
ui-release: awx/ui_next/node_modules $(UI_BUILD_FLAG_FILE)
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
# Build a pip-installable package into dist/ with a timestamped version number.
@@ -531,31 +460,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 $(COMPOSE_UP_OPTS) up --no-recreate awx
docker-compose-sources: .git/hooks/pre-commit
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_1
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
@@ -563,21 +491,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);)
@@ -589,11 +510,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
@@ -607,7 +528,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,8 +1,9 @@
[![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)](irc.libera.chat - #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" />
AWX provides a web-based user interface, REST API, and task engine built on top of [Ansible](https://github.com/ansible/ansible). It is the upstream project for [Tower](https://www.ansible.com/tower), a commercial derivative of AWX.
AWX provides a web-based user interface, REST API, and task engine built on top of [Ansible](https://github.com/ansible/ansible). It is one of the upstream projects for [Red Hat Ansible Automation Platform](https://www.ansible.com/products/automation-platform).
To install AWX, please view the [Install guide](./INSTALL.md).
@@ -16,31 +17,25 @@ 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 webchat.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
------------
We welcome your feedback and ideas. Here's how to reach us with feedback and questions:
- Join the `#ansible-awx` channel on irc.freenode.net
- Join the `#ansible-awx` channel on webchat.freenode.net
- Join the [mailing list](https://groups.google.com/forum/#!forum/awx-project)
License
-------
[Apache v2](./LICENSE.md)

View File

@@ -1 +1 @@
16.0.0
19.2.0

View File

@@ -15,9 +15,10 @@ __all__ = ['__version__']
# Check for the presence/absence of "devonly" module to determine if running
# from a source code checkout or release packaage.
try:
import awx.devonly # noqa
import awx.devonly # noqa
MODE = 'development'
except ImportError: # pragma: no cover
except ImportError: # pragma: no cover
MODE = 'production'
@@ -25,6 +26,7 @@ import hashlib
try:
import django # noqa: F401
HAS_DJANGO = True
except ImportError:
HAS_DJANGO = False
@@ -40,6 +42,7 @@ if HAS_DJANGO is True:
try:
names_digest('foo', 'bar', 'baz', length=8)
except ValueError:
def names_digest(*args, length):
"""
Generate a 32-bit digest of a set of arguments that can be used to shorten
@@ -64,7 +67,7 @@ def find_commands(management_dir):
continue
elif f.endswith('.py') and f[:-3] not in commands:
commands.append(f[:-3])
elif f.endswith('.pyc') and f[:-4] not in commands: # pragma: no cover
elif f.endswith('.pyc') and f[:-4] not in commands: # pragma: no cover
commands.append(f[:-4])
except OSError:
pass
@@ -75,13 +78,14 @@ def oauth2_getattribute(self, attr):
# Custom method to override
# oauth2_provider.settings.OAuth2ProviderSettings.__getattribute__
from django.conf import settings
val = None
if 'migrate' not in sys.argv:
# certain Django OAuth Toolkit migrations actually reference
# setting lookups for references to model classes (e.g.,
# oauth2_settings.REFRESH_TOKEN_MODEL)
# If we're doing an OAuth2 setting lookup *while running* a migration,
# don't do our usual "Configure Tower in Tower" database setting lookup
# don't do our usual database settings lookup
val = settings.OAUTH2_PROVIDER.get(attr)
if val is None:
val = object.__getattribute__(self, attr)
@@ -94,33 +98,38 @@ def prepare_env():
# Hide DeprecationWarnings when running in production. Need to first load
# settings to apply our filter after Django's own warnings filter.
from django.conf import settings
if not settings.DEBUG: # pragma: no cover
if not settings.DEBUG: # pragma: no cover
warnings.simplefilter('ignore', DeprecationWarning)
# Monkeypatch Django find_commands to also work with .pyc files.
import django.core.management
django.core.management.find_commands = find_commands
# Monkeypatch Oauth2 toolkit settings class to check for settings
# in django.conf settings each time, not just once during import
import oauth2_provider.settings
oauth2_provider.settings.OAuth2ProviderSettings.__getattribute__ = oauth2_getattribute
# Use the AWX_TEST_DATABASE_* environment variables to specify the test
# database settings to use when management command is run as an external
# program via unit tests.
for opt in ('ENGINE', 'NAME', 'USER', 'PASSWORD', 'HOST', 'PORT'): # pragma: no cover
for opt in ('ENGINE', 'NAME', 'USER', 'PASSWORD', 'HOST', 'PORT'): # pragma: no cover
if os.environ.get('AWX_TEST_DATABASE_%s' % opt, None):
settings.DATABASES['default'][opt] = os.environ['AWX_TEST_DATABASE_%s' % opt]
# Disable capturing all SQL queries in memory when in DEBUG mode.
if settings.DEBUG and not getattr(settings, 'SQL_DEBUG', True):
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.utils import CursorWrapper
BaseDatabaseWrapper.make_debug_cursor = lambda self, cursor: CursorWrapper(cursor, self)
# Use the default devserver addr/port defined in settings for runserver.
default_addr = getattr(settings, 'DEVSERVER_DEFAULT_ADDR', '127.0.0.1')
default_port = getattr(settings, 'DEVSERVER_DEFAULT_PORT', 8000)
from django.core.management.commands import runserver as core_runserver
original_handle = core_runserver.Command.handle
def handle(self, *args, **options):
@@ -139,7 +148,8 @@ def manage():
# Now run the command (or display the version).
from django.conf import settings
from django.core.management import execute_from_command_line
if len(sys.argv) >= 2 and sys.argv[1] in ('version', '--version'): # pragma: no cover
if len(sys.argv) >= 2 and sys.argv[1] in ('version', '--version'): # pragma: no cover
sys.stdout.write('%s\n' % __version__)
# If running as a user without permission to read settings, display an
# error message. Allow --help to still work.

View File

@@ -18,7 +18,6 @@ logger = logging.getLogger('awx.api.authentication')
class LoggedBasicAuthentication(authentication.BasicAuthentication):
def authenticate(self, request):
if not settings.AUTH_BASIC_ENABLED:
return
@@ -35,22 +34,18 @@ class LoggedBasicAuthentication(authentication.BasicAuthentication):
class SessionAuthentication(authentication.SessionAuthentication):
def authenticate_header(self, request):
return 'Session'
class LoggedOAuth2Authentication(OAuth2Authentication):
def authenticate(self, request):
ret = super(LoggedOAuth2Authentication, self).authenticate(request)
if ret:
user, token = ret
username = user.username if user else '<none>'
logger.info(smart_text(
u"User {} performed a {} to {} through the API using OAuth 2 token {}.".format(
username, request.method, request.path, token.pk
)
))
logger.info(
smart_text(u"User {} performed a {} to {} through the API using OAuth 2 token {}.".format(username, request.method, request.path, token.pk))
)
setattr(user, 'oauth_scopes', [x for x in token.scope.split() if x])
return ret

View File

@@ -1,8 +1,12 @@
# Django
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
# Django REST Framework
from rest_framework import serializers
# AWX
from awx.conf import fields, register
from awx.conf import fields, register, register_validate
from awx.api.fields import OAuth2ProviderField
from oauth2_provider.settings import oauth2_settings
@@ -27,6 +31,17 @@ register(
category=_('Authentication'),
category_slug='authentication',
)
register(
'DISABLE_LOCAL_AUTH',
field_class=fields.BooleanField,
label=_('Disable the built-in authentication system'),
help_text=_(
"Controls whether users are prevented from using the built-in authentication system. "
"You probably want to do this if you are using an LDAP or SAML integration."
),
category=_('Authentication'),
category_slug='authentication',
)
register(
'AUTH_BASIC_ENABLED',
field_class=fields.BooleanField,
@@ -38,16 +53,20 @@ register(
register(
'OAUTH2_PROVIDER',
field_class=OAuth2ProviderField,
default={'ACCESS_TOKEN_EXPIRE_SECONDS': oauth2_settings.ACCESS_TOKEN_EXPIRE_SECONDS,
'AUTHORIZATION_CODE_EXPIRE_SECONDS': oauth2_settings.AUTHORIZATION_CODE_EXPIRE_SECONDS,
'REFRESH_TOKEN_EXPIRE_SECONDS': oauth2_settings.REFRESH_TOKEN_EXPIRE_SECONDS},
default={
'ACCESS_TOKEN_EXPIRE_SECONDS': oauth2_settings.ACCESS_TOKEN_EXPIRE_SECONDS,
'AUTHORIZATION_CODE_EXPIRE_SECONDS': oauth2_settings.AUTHORIZATION_CODE_EXPIRE_SECONDS,
'REFRESH_TOKEN_EXPIRE_SECONDS': oauth2_settings.REFRESH_TOKEN_EXPIRE_SECONDS,
},
label=_('OAuth 2 Timeout Settings'),
help_text=_('Dictionary for customizing OAuth 2 timeouts, available items are '
'`ACCESS_TOKEN_EXPIRE_SECONDS`, the duration of access tokens in the number '
'of seconds, `AUTHORIZATION_CODE_EXPIRE_SECONDS`, the duration of '
'authorization codes in the number of seconds, and `REFRESH_TOKEN_EXPIRE_SECONDS`, '
'the duration of refresh tokens, after expired access tokens, '
'in the number of seconds.'),
help_text=_(
'Dictionary for customizing OAuth 2 timeouts, available items are '
'`ACCESS_TOKEN_EXPIRE_SECONDS`, the duration of access tokens in the number '
'of seconds, `AUTHORIZATION_CODE_EXPIRE_SECONDS`, the duration of '
'authorization codes in the number of seconds, and `REFRESH_TOKEN_EXPIRE_SECONDS`, '
'the duration of refresh tokens, after expired access tokens, '
'in the number of seconds.'
),
category=_('Authentication'),
category_slug='authentication',
unit=_('seconds'),
@@ -57,10 +76,12 @@ register(
field_class=fields.BooleanField,
default=False,
label=_('Allow External Users to Create OAuth2 Tokens'),
help_text=_('For security reasons, users from external auth providers (LDAP, SAML, '
'SSO, Radius, and others) are not allowed to create OAuth2 tokens. '
'To change this behavior, enable this setting. Existing tokens will '
'not be deleted when this setting is toggled off.'),
help_text=_(
'For security reasons, users from external auth providers (LDAP, SAML, '
'SSO, Radius, and others) are not allowed to create OAuth2 tokens. '
'To change this behavior, enable this setting. Existing tokens will '
'not be deleted when this setting is toggled off.'
),
category=_('Authentication'),
category_slug='authentication',
)
@@ -71,8 +92,27 @@ register(
required=False,
default='',
label=_('Login redirect override URL'),
help_text=_('URL to which unauthorized users will be redirected to log in. '
'If blank, users will be sent to the Tower login page.'),
help_text=_('URL to which unauthorized users will be redirected to log in. If blank, users will be sent to the login page.'),
category=_('Authentication'),
category_slug='authentication',
)
def authentication_validate(serializer, attrs):
remote_auth_settings = [
'AUTH_LDAP_SERVER_URI',
'SOCIAL_AUTH_GOOGLE_OAUTH2_KEY',
'SOCIAL_AUTH_GITHUB_KEY',
'SOCIAL_AUTH_GITHUB_ORG_KEY',
'SOCIAL_AUTH_GITHUB_TEAM_KEY',
'SOCIAL_AUTH_SAML_ENABLED_IDPS',
'RADIUS_SERVER',
'TACACSPLUS_HOST',
]
if attrs.get('DISABLE_LOCAL_AUTH', False):
if not any(getattr(settings, s, None) for s in remote_auth_settings):
raise serializers.ValidationError(_("There are no remote authentication systems configured."))
return attrs
register_validate('authentication', authentication_validate)

View File

@@ -16,7 +16,4 @@ class ActiveJobConflict(ValidationError):
# turn everything in self.detail into string by using force_text.
# Declare detail afterwards circumvent this behavior.
super(ActiveJobConflict, self).__init__()
self.detail = {
"error": _("Resource is being used by running jobs."),
"active_jobs": active_jobs
}
self.detail = {"error": _("Resource is being used by running jobs."), "active_jobs": active_jobs}

View File

@@ -16,10 +16,10 @@ __all__ = ['BooleanNullField', 'CharNullField', 'ChoiceNullField', 'VerbatimFiel
class NullFieldMixin(object):
'''
"""
Mixin to prevent shortcutting validation when we want to allow null input,
but coerce the resulting value to another type.
'''
"""
def validate_empty_values(self, data):
(is_empty_value, data) = super(NullFieldMixin, self).validate_empty_values(data)
@@ -29,18 +29,18 @@ class NullFieldMixin(object):
class BooleanNullField(NullFieldMixin, serializers.NullBooleanField):
'''
"""
Custom boolean field that allows null and empty string as False values.
'''
"""
def to_internal_value(self, data):
return bool(super(BooleanNullField, self).to_internal_value(data))
class CharNullField(NullFieldMixin, serializers.CharField):
'''
"""
Custom char field that allows null as input and coerces to an empty string.
'''
"""
def __init__(self, **kwargs):
kwargs['allow_null'] = True
@@ -51,9 +51,9 @@ class CharNullField(NullFieldMixin, serializers.CharField):
class ChoiceNullField(NullFieldMixin, serializers.ChoiceField):
'''
"""
Custom choice field that allows null as input and coerces to an empty string.
'''
"""
def __init__(self, **kwargs):
kwargs['allow_null'] = True
@@ -64,9 +64,9 @@ class ChoiceNullField(NullFieldMixin, serializers.ChoiceField):
class VerbatimField(serializers.Field):
'''
"""
Custom field that passes the value through without changes.
'''
"""
def to_internal_value(self, data):
return data
@@ -77,22 +77,19 @@ class VerbatimField(serializers.Field):
class OAuth2ProviderField(fields.DictField):
default_error_messages = {
'invalid_key_names': _('Invalid key names: {invalid_key_names}'),
}
default_error_messages = {'invalid_key_names': _('Invalid key names: {invalid_key_names}')}
valid_key_names = {'ACCESS_TOKEN_EXPIRE_SECONDS', 'AUTHORIZATION_CODE_EXPIRE_SECONDS', 'REFRESH_TOKEN_EXPIRE_SECONDS'}
child = fields.IntegerField(min_value=1)
def to_internal_value(self, data):
data = super(OAuth2ProviderField, self).to_internal_value(data)
invalid_flags = (set(data.keys()) - self.valid_key_names)
invalid_flags = set(data.keys()) - self.valid_key_names
if invalid_flags:
self.fail('invalid_key_names', invalid_key_names=', '.join(list(invalid_flags)))
return data
class DeprecatedCredentialField(serializers.IntegerField):
def __init__(self, **kwargs):
kwargs['allow_null'] = True
kwargs['default'] = None

View File

@@ -27,9 +27,9 @@ from awx.main.utils.db import get_all_field_names
class TypeFilterBackend(BaseFilterBackend):
'''
"""
Filter on type field now returned with all objects.
'''
"""
def filter_queryset(self, request, queryset, view):
try:
@@ -64,7 +64,7 @@ class TypeFilterBackend(BaseFilterBackend):
def get_fields_from_path(model, path):
'''
"""
Given a Django ORM lookup path (possibly over multiple models)
Returns the fields in the line, and also the revised lookup path
ex., given
@@ -73,7 +73,7 @@ def get_fields_from_path(model, path):
returns tuple of fields traversed as well and a corrected path,
for special cases we do substitutions
([<IntegerField for timeout>], 'project__timeout')
'''
"""
# Store of all the fields used to detect repeats
field_list = []
new_parts = []
@@ -82,12 +82,9 @@ def get_fields_from_path(model, path):
raise ParseError(_('No related model for field {}.').format(name))
# HACK: Make project and inventory source filtering by old field names work for backwards compatibility.
if model._meta.object_name in ('Project', 'InventorySource'):
name = {
'current_update': 'current_job',
'last_update': 'last_job',
'last_update_failed': 'last_job_failed',
'last_updated': 'last_job_run',
}.get(name, name)
name = {'current_update': 'current_job', 'last_update': 'last_job', 'last_update_failed': 'last_job_failed', 'last_updated': 'last_job_run'}.get(
name, name
)
if name == 'type' and 'polymorphic_ctype' in get_all_field_names(model):
name = 'polymorphic_ctype'
@@ -121,28 +118,42 @@ def get_fields_from_path(model, path):
def get_field_from_path(model, path):
'''
"""
Given a Django ORM lookup path (possibly over multiple models)
Returns the last field in the line, and the revised lookup path
ex.
(<IntegerField for timeout>, 'project__timeout')
'''
"""
field_list, new_path = get_fields_from_path(model, path)
return (field_list[-1], new_path)
class FieldLookupBackend(BaseFilterBackend):
'''
"""
Filter using field lookups provided via query string parameters.
'''
"""
RESERVED_NAMES = ('page', 'page_size', 'format', 'order', 'order_by',
'search', 'type', 'host_filter', 'count_disabled', 'no_truncate')
RESERVED_NAMES = ('page', 'page_size', 'format', 'order', 'order_by', 'search', 'type', 'host_filter', 'count_disabled', 'no_truncate')
SUPPORTED_LOOKUPS = ('exact', 'iexact', 'contains', 'icontains',
'startswith', 'istartswith', 'endswith', 'iendswith',
'regex', 'iregex', 'gt', 'gte', 'lt', 'lte', 'in',
'isnull', 'search')
SUPPORTED_LOOKUPS = (
'exact',
'iexact',
'contains',
'icontains',
'startswith',
'istartswith',
'endswith',
'iendswith',
'regex',
'iregex',
'gt',
'gte',
'lt',
'lte',
'in',
'isnull',
'search',
)
# A list of fields that we know can be filtered on without the possiblity
# of introducing duplicates
@@ -189,10 +200,7 @@ class FieldLookupBackend(BaseFilterBackend):
try:
return self.to_python_related(value)
except ValueError:
raise ParseError(_('Invalid {field_name} id: {field_id}').format(
field_name=getattr(field, 'name', 'related field'),
field_id=value)
)
raise ParseError(_('Invalid {field_name} id: {field_id}').format(field_name=getattr(field, 'name', 'related field'), field_id=value))
else:
return field.to_python(value)
@@ -205,13 +213,13 @@ class FieldLookupBackend(BaseFilterBackend):
field_list, new_lookup = self.get_fields_from_lookup(model, lookup)
field = field_list[-1]
needs_distinct = (not all(isinstance(f, self.NO_DUPLICATES_ALLOW_LIST) for f in field_list))
needs_distinct = not all(isinstance(f, self.NO_DUPLICATES_ALLOW_LIST) for f in field_list)
# Type names are stored without underscores internally, but are presented and
# and serialized over the API containing underscores so we remove `_`
# for polymorphic_ctype__model lookups.
if new_lookup.startswith('polymorphic_ctype__model'):
value = value.replace('_','')
value = value.replace('_', '')
elif new_lookup.endswith('__isnull'):
value = to_python_boolean(value)
elif new_lookup.endswith('__in'):
@@ -329,24 +337,20 @@ class FieldLookupBackend(BaseFilterBackend):
args = []
for n, k, v in and_filters:
if n:
args.append(~Q(**{k:v}))
args.append(~Q(**{k: v}))
else:
args.append(Q(**{k:v}))
args.append(Q(**{k: v}))
for role_name in role_filters:
if not hasattr(queryset.model, 'accessible_pk_qs'):
raise ParseError(_(
'Cannot apply role_level filter to this list because its model '
'does not use roles for access control.'))
args.append(
Q(pk__in=queryset.model.accessible_pk_qs(request.user, role_name))
)
raise ParseError(_('Cannot apply role_level filter to this list because its model ' 'does not use roles for access control.'))
args.append(Q(pk__in=queryset.model.accessible_pk_qs(request.user, role_name)))
if or_filters:
q = Q()
for n,k,v in or_filters:
for n, k, v in or_filters:
if n:
q |= ~Q(**{k:v})
q |= ~Q(**{k: v})
else:
q |= Q(**{k:v})
q |= Q(**{k: v})
args.append(q)
if search_filters and search_filter_relation == 'OR':
q = Q()
@@ -360,11 +364,11 @@ class FieldLookupBackend(BaseFilterBackend):
for constrain in constrains:
q_chain |= Q(**{constrain: term})
queryset = queryset.filter(q_chain)
for n,k,v in chain_filters:
for n, k, v in chain_filters:
if n:
q = ~Q(**{k:v})
q = ~Q(**{k: v})
else:
q = Q(**{k:v})
q = Q(**{k: v})
queryset = queryset.filter(q)
queryset = queryset.filter(*args)
if needs_distinct:
@@ -377,9 +381,9 @@ class FieldLookupBackend(BaseFilterBackend):
class OrderByBackend(BaseFilterBackend):
'''
"""
Filter to apply ordering based on query string parameters.
'''
"""
def filter_queryset(self, request, queryset, view):
try:

View File

@@ -35,55 +35,50 @@ from rest_framework.negotiation import DefaultContentNegotiation
# AWX
from awx.api.filters import FieldLookupBackend
from awx.main.models import (
UnifiedJob, UnifiedJobTemplate, User, Role, Credential,
WorkflowJobTemplateNode, WorkflowApprovalTemplate
)
from awx.main.models import UnifiedJob, UnifiedJobTemplate, User, Role, Credential, WorkflowJobTemplateNode, WorkflowApprovalTemplate
from awx.main.access import access_registry
from awx.main.utils import (
camelcase_to_underscore,
get_search_fields,
getattrd,
get_object_or_400,
decrypt_field,
get_awx_version,
)
from awx.main.utils import camelcase_to_underscore, get_search_fields, getattrd, get_object_or_400, decrypt_field, get_awx_version
from awx.main.utils.db import get_all_field_names
from awx.main.views import ApiErrorView
from awx.api.serializers import ResourceAccessListElementSerializer, CopySerializer, UserSerializer
from awx.api.versioning import URLPathVersioning
from awx.api.metadata import SublistAttachDetatchMetadata, Metadata
__all__ = ['APIView', 'GenericAPIView', 'ListAPIView', 'SimpleListAPIView',
'ListCreateAPIView', 'SubListAPIView', 'SubListCreateAPIView',
'SubListDestroyAPIView',
'SubListCreateAttachDetachAPIView', 'RetrieveAPIView',
'RetrieveUpdateAPIView', 'RetrieveDestroyAPIView',
'RetrieveUpdateDestroyAPIView',
'SubDetailAPIView',
'ResourceAccessList',
'ParentMixin',
'DeleteLastUnattachLabelMixin',
'SubListAttachDetachAPIView',
'CopyAPIView', 'BaseUsersList',]
__all__ = [
'APIView',
'GenericAPIView',
'ListAPIView',
'SimpleListAPIView',
'ListCreateAPIView',
'SubListAPIView',
'SubListCreateAPIView',
'SubListDestroyAPIView',
'SubListCreateAttachDetachAPIView',
'RetrieveAPIView',
'RetrieveUpdateAPIView',
'RetrieveDestroyAPIView',
'RetrieveUpdateDestroyAPIView',
'SubDetailAPIView',
'ResourceAccessList',
'ParentMixin',
'DeleteLastUnattachLabelMixin',
'SubListAttachDetachAPIView',
'CopyAPIView',
'BaseUsersList',
]
logger = logging.getLogger('awx.api.generics')
analytics_logger = logging.getLogger('awx.analytics.performance')
class LoggedLoginView(auth_views.LoginView):
def get(self, request, *args, **kwargs):
# The django.auth.contrib login form doesn't perform the content
# negotiation we've come to expect from DRF; add in code to catch
# situations where Accept != text/html (or */*) and reply with
# an HTTP 406
try:
DefaultContentNegotiation().select_renderer(
request,
[StaticHTMLRenderer],
'html'
)
DefaultContentNegotiation().select_renderer(request, [StaticHTMLRenderer], 'html')
except NotAcceptable:
resp = Response(status=status.HTTP_406_NOT_ACCEPTABLE)
resp.accepted_renderer = StaticHTMLRenderer()
@@ -96,7 +91,7 @@ class LoggedLoginView(auth_views.LoginView):
ret = super(LoggedLoginView, self).post(request, *args, **kwargs)
current_user = getattr(request, 'user', None)
if request.user.is_authenticated:
logger.info(smart_text(u"User {} logged in from {}".format(self.request.user.username,request.META.get('REMOTE_ADDR', None))))
logger.info(smart_text(u"User {} logged in from {}".format(self.request.user.username, request.META.get('REMOTE_ADDR', None))))
ret.set_cookie('userLoggedIn', 'true')
current_user = UserSerializer(self.request.user)
current_user = smart_text(JSONRenderer().render(current_user.data))
@@ -106,29 +101,27 @@ class LoggedLoginView(auth_views.LoginView):
return ret
else:
if 'username' in self.request.POST:
logger.warn(smart_text(u"Login failed for user {} from {}".format(self.request.POST.get('username'),request.META.get('REMOTE_ADDR', None))))
logger.warn(smart_text(u"Login failed for user {} from {}".format(self.request.POST.get('username'), request.META.get('REMOTE_ADDR', None))))
ret.status_code = 401
return ret
class LoggedLogoutView(auth_views.LogoutView):
def dispatch(self, request, *args, **kwargs):
original_user = getattr(request, 'user', None)
ret = super(LoggedLogoutView, self).dispatch(request, *args, **kwargs)
current_user = getattr(request, 'user', None)
ret.set_cookie('userLoggedIn', 'false')
if (not current_user or not getattr(current_user, 'pk', True)) \
and current_user != original_user:
if (not current_user or not getattr(current_user, 'pk', True)) and current_user != original_user:
logger.info("User {} logged out.".format(original_user.username))
return ret
def get_view_description(view, html=False):
'''Wrapper around REST framework get_view_description() to continue
"""Wrapper around REST framework get_view_description() to continue
to support our historical div.
'''
"""
desc = views.get_view_description(view, html=html)
if html:
desc = '<div class="description">%s</div>' % desc
@@ -138,6 +131,7 @@ def get_view_description(view, html=False):
def get_default_schema():
if settings.SETTINGS_MODULE == 'awx.settings.development':
from awx.api.swagger import AutoSchema
return AutoSchema()
else:
return views.APIView.schema
@@ -149,21 +143,23 @@ class APIView(views.APIView):
versioning_class = URLPathVersioning
def initialize_request(self, request, *args, **kwargs):
'''
"""
Store the Django REST Framework Request object as an attribute on the
normal Django request, store time the request started.
'''
"""
self.time_started = time.time()
if getattr(settings, 'SQL_DEBUG', False):
self.queries_before = len(connection.queries)
# If there are any custom headers in REMOTE_HOST_HEADERS, make sure
# they respect the allowed proxy list
if all([
settings.PROXY_IP_ALLOWED_LIST,
request.environ.get('REMOTE_ADDR') not in settings.PROXY_IP_ALLOWED_LIST,
request.environ.get('REMOTE_HOST') not in settings.PROXY_IP_ALLOWED_LIST
]):
if all(
[
settings.PROXY_IP_ALLOWED_LIST,
request.environ.get('REMOTE_ADDR') not in settings.PROXY_IP_ALLOWED_LIST,
request.environ.get('REMOTE_HOST') not in settings.PROXY_IP_ALLOWED_LIST,
]
):
for custom_header in settings.REMOTE_HOST_HEADERS:
if custom_header.startswith('HTTP_'):
request.environ.pop(custom_header, None)
@@ -178,17 +174,19 @@ class APIView(views.APIView):
request.drf_request_user = None
self.__init_request_error__ = exc
except UnsupportedMediaType as exc:
exc.detail = _('You did not use correct Content-Type in your HTTP request. '
'If you are using our REST API, the Content-Type must be application/json')
exc.detail = _(
'You did not use correct Content-Type in your HTTP request. ' 'If you are using our REST API, the Content-Type must be application/json'
)
self.__init_request_error__ = exc
return drf_request
def finalize_response(self, request, response, *args, **kwargs):
'''
"""
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()
@@ -212,8 +210,12 @@ class APIView(views.APIView):
return response
if response.status_code >= 400:
status_msg = "status %s received by user %s attempting to access %s from %s" % \
(response.status_code, request.user, request.path, request.META.get('REMOTE_ADDR', None))
status_msg = "status %s received by user %s attempting to access %s from %s" % (
response.status_code,
request.user,
request.path,
request.META.get('REMOTE_ADDR', None),
)
if hasattr(self, '__init_request_error__'):
response = self.handle_exception(self.__init_request_error__)
if response.status_code == 401:
@@ -225,7 +227,7 @@ class APIView(views.APIView):
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(), OpenLicense) else 'Red Hat Ansible Tower'
response['X-API-Node'] = settings.CLUSTER_HOST_ID
if time_started:
time_elapsed = time.time() - self.time_started
@@ -311,18 +313,12 @@ class APIView(views.APIView):
return data
def determine_version(self, request, *args, **kwargs):
return (
getattr(request, 'version', None),
getattr(request, 'versioning_scheme', None),
)
return (getattr(request, 'version', None), getattr(request, 'versioning_scheme', None))
def dispatch(self, request, *args, **kwargs):
if self.versioning_class is not None:
scheme = self.versioning_class()
request.version, request.versioning_scheme = (
scheme.determine_version(request, *args, **kwargs),
scheme
)
request.version, request.versioning_scheme = (scheme.determine_version(request, *args, **kwargs), scheme)
if 'version' in kwargs:
kwargs.pop('version')
return super(APIView, self).dispatch(request, *args, **kwargs)
@@ -378,25 +374,22 @@ class GenericAPIView(generics.GenericAPIView, APIView):
d = super(GenericAPIView, self).get_description_context()
if hasattr(self.model, "_meta"):
if hasattr(self.model._meta, "verbose_name"):
d.update({
'model_verbose_name': smart_text(self.model._meta.verbose_name),
'model_verbose_name_plural': smart_text(self.model._meta.verbose_name_plural),
})
d.update(
{
'model_verbose_name': smart_text(self.model._meta.verbose_name),
'model_verbose_name_plural': smart_text(self.model._meta.verbose_name_plural),
}
)
serializer = self.get_serializer()
metadata = self.metadata_class()
metadata.request = self.request
for method, key in [
('GET', 'serializer_fields'),
('POST', 'serializer_create_fields'),
('PUT', 'serializer_update_fields')
]:
for method, key in [('GET', 'serializer_fields'), ('POST', 'serializer_create_fields'), ('PUT', 'serializer_update_fields')]:
d[key] = metadata.get_serializer_info(serializer, method=method)
d['settings'] = settings
return d
class SimpleListAPIView(generics.ListAPIView, GenericAPIView):
def get_queryset(self):
return self.request.user.get_queryset(self.model)
@@ -413,9 +406,7 @@ class ListAPIView(generics.ListAPIView, GenericAPIView):
else:
order_field = 'name'
d = super(ListAPIView, self).get_description_context()
d.update({
'order_field': order_field,
})
d.update({'order_field': order_field})
return d
@property
@@ -426,9 +417,13 @@ class ListAPIView(generics.ListAPIView, GenericAPIView):
def related_search_fields(self):
def skip_related_name(name):
return (
name is None or name.endswith('_role') or name.startswith('_') or
name.startswith('deprecated_') or name.endswith('_set') or
name == 'polymorphic_ctype')
name is None
or name.endswith('_role')
or name.startswith('_')
or name.startswith('deprecated_')
or name.endswith('_set')
or name == 'polymorphic_ctype'
)
fields = set([])
for field in self.model._meta.fields:
@@ -482,9 +477,7 @@ class ParentMixin(object):
def get_parent_object(self):
if self.parent_object is not None:
return self.parent_object
parent_filter = {
self.lookup_field: self.kwargs.get(self.lookup_field, None),
}
parent_filter = {self.lookup_field: self.kwargs.get(self.lookup_field, None)}
self.parent_object = get_object_or_404(self.parent_model, **parent_filter)
return self.parent_object
@@ -513,10 +506,12 @@ class SubListAPIView(ParentMixin, ListAPIView):
def get_description_context(self):
d = super(SubListAPIView, self).get_description_context()
d.update({
'parent_model_verbose_name': smart_text(self.parent_model._meta.verbose_name),
'parent_model_verbose_name_plural': smart_text(self.parent_model._meta.verbose_name_plural),
})
d.update(
{
'parent_model_verbose_name': smart_text(self.parent_model._meta.verbose_name),
'parent_model_verbose_name_plural': smart_text(self.parent_model._meta.verbose_name_plural),
}
)
return d
def get_queryset(self):
@@ -531,7 +526,6 @@ class SubListAPIView(ParentMixin, ListAPIView):
class DestroyAPIView(generics.DestroyAPIView):
def has_delete_permission(self, obj):
return self.request.user.can_access(self.model, 'delete', obj)
@@ -545,12 +539,12 @@ class SubListDestroyAPIView(DestroyAPIView, SubListAPIView):
"""
Concrete view for deleting everything related by `relationship`.
"""
check_sub_obj_permission = True
def destroy(self, request, *args, **kwargs):
instance_list = self.get_queryset()
if (not self.check_sub_obj_permission and
not request.user.can_access(self.parent_model, 'delete', self.get_parent_object())):
if not self.check_sub_obj_permission and not request.user.can_access(self.parent_model, 'delete', self.get_parent_object()):
raise PermissionDenied()
self.perform_list_destroy(instance_list)
return Response(status=status.HTTP_204_NO_CONTENT)
@@ -574,9 +568,7 @@ class SubListCreateAPIView(SubListAPIView, ListCreateAPIView):
def get_description_context(self):
d = super(SubListCreateAPIView, self).get_description_context()
d.update({
'parent_key': getattr(self, 'parent_key', None),
})
d.update({'parent_key': getattr(self, 'parent_key', None)})
return d
def get_queryset(self):
@@ -610,8 +602,7 @@ class SubListCreateAPIView(SubListAPIView, ListCreateAPIView):
# attempt to deserialize the object
serializer = self.get_serializer(data=data)
if not serializer.is_valid():
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# Verify we have permission to add the object as given.
if not request.user.can_access(self.model, 'add', serializer.validated_data):
@@ -635,9 +626,7 @@ class SubListCreateAttachDetachAPIView(SubListCreateAPIView):
def get_description_context(self):
d = super(SubListCreateAttachDetachAPIView, self).get_description_context()
d.update({
"has_attach": True,
})
d.update({"has_attach": True})
return d
def attach_validate(self, request):
@@ -675,9 +664,7 @@ class SubListCreateAttachDetachAPIView(SubListCreateAPIView):
sub = get_object_or_400(self.model, pk=sub_id)
# Verify we have permission to attach.
if not request.user.can_access(self.parent_model, 'attach', parent, sub,
self.relationship, data,
skip_sub_obj_read_check=created):
if not request.user.can_access(self.parent_model, 'attach', parent, sub, self.relationship, data, skip_sub_obj_read_check=created):
raise PermissionDenied()
# Verify that the relationship to be added is valid.
@@ -716,8 +703,7 @@ class SubListCreateAttachDetachAPIView(SubListCreateAPIView):
relationship = getattrd(parent, self.relationship)
sub = get_object_or_400(self.model, pk=sub_id)
if not request.user.can_access(self.parent_model, 'unattach', parent,
sub, self.relationship, request.data):
if not request.user.can_access(self.parent_model, 'unattach', parent, sub, self.relationship, request.data):
raise PermissionDenied()
if parent_key:
@@ -735,28 +721,24 @@ class SubListCreateAttachDetachAPIView(SubListCreateAPIView):
def post(self, request, *args, **kwargs):
if not isinstance(request.data, dict):
return Response('invalid type for post data',
status=status.HTTP_400_BAD_REQUEST)
return Response('invalid type for post data', status=status.HTTP_400_BAD_REQUEST)
if 'disassociate' in request.data:
return self.unattach(request, *args, **kwargs)
else:
return self.attach(request, *args, **kwargs)
class SubListAttachDetachAPIView(SubListCreateAttachDetachAPIView):
'''
"""
Derived version of SubListCreateAttachDetachAPIView that prohibits creation
'''
"""
metadata_class = SublistAttachDetatchMetadata
def post(self, request, *args, **kwargs):
sub_id = request.data.get('id', None)
if not sub_id:
return Response(
dict(msg=_("{} 'id' field is missing.".format(
self.model._meta.verbose_name.title()))),
status=status.HTTP_400_BAD_REQUEST)
return Response(dict(msg=_("{} 'id' field is missing.".format(self.model._meta.verbose_name.title()))), status=status.HTTP_400_BAD_REQUEST)
return super(SubListAttachDetachAPIView, self).post(request, *args, **kwargs)
def update_raw_data(self, data):
@@ -768,11 +750,11 @@ class SubListAttachDetachAPIView(SubListCreateAttachDetachAPIView):
class DeleteLastUnattachLabelMixin(object):
'''
"""
Models for which you want the last instance to be deleted from the database
when the last disassociate is called should inherit from this class. Further,
the model should implement is_detached()
'''
"""
def unattach(self, request, *args, **kwargs):
(sub_id, res) = super(DeleteLastUnattachLabelMixin, self).unattach_validate(request)
@@ -798,7 +780,6 @@ class RetrieveAPIView(generics.RetrieveAPIView, GenericAPIView):
class RetrieveUpdateAPIView(RetrieveAPIView, generics.RetrieveUpdateAPIView):
def update(self, request, *args, **kwargs):
self.update_filter(request, *args, **kwargs)
return super(RetrieveUpdateAPIView, self).update(request, *args, **kwargs)
@@ -808,7 +789,7 @@ class RetrieveUpdateAPIView(RetrieveAPIView, generics.RetrieveUpdateAPIView):
return super(RetrieveUpdateAPIView, self).partial_update(request, *args, **kwargs)
def update_filter(self, request, *args, **kwargs):
''' scrub any fields the user cannot/should not put/patch, based on user context. This runs after read-only serialization filtering '''
'''scrub any fields the user cannot/should not put/patch, based on user context. This runs after read-only serialization filtering'''
pass
@@ -839,6 +820,7 @@ class ResourceAccessList(ParentMixin, ListAPIView):
def trigger_delayed_deep_copy(*args, **kwargs):
from awx.main.tasks import deep_copy_model_obj
connection.on_commit(lambda: deep_copy_model_obj.delay(*args, **kwargs))
@@ -869,8 +851,7 @@ class CopyAPIView(GenericAPIView):
field_val[secret] = decrypt_field(obj, secret)
elif isinstance(field_val, dict):
for sub_field in field_val:
if isinstance(sub_field, str) \
and isinstance(field_val[sub_field], str):
if isinstance(sub_field, str) and isinstance(field_val[sub_field], str):
field_val[sub_field] = decrypt_field(obj, field_name, sub_field)
elif isinstance(field_val, str):
try:
@@ -882,15 +863,11 @@ class CopyAPIView(GenericAPIView):
def _build_create_dict(self, obj):
ret = {}
if self.copy_return_serializer_class:
all_fields = Metadata().get_serializer_info(
self._get_copy_return_serializer(), method='POST'
)
all_fields = Metadata().get_serializer_info(self._get_copy_return_serializer(), method='POST')
for field_name, field_info in all_fields.items():
if not hasattr(obj, field_name) or field_info.get('read_only', True):
continue
ret[field_name] = CopyAPIView._decrypt_model_field_if_needed(
obj, field_name, getattr(obj, field_name)
)
ret[field_name] = CopyAPIView._decrypt_model_field_if_needed(obj, field_name, getattr(obj, field_name))
return ret
@staticmethod
@@ -908,9 +885,11 @@ class CopyAPIView(GenericAPIView):
except AttributeError:
continue
# Adjust copy blocked fields here.
if field.name in fields_to_discard or field.name in [
'id', 'pk', 'polymorphic_ctype', 'unifiedjobtemplate_ptr', 'created_by', 'modified_by'
] or field.name.endswith('_role'):
if (
field.name in fields_to_discard
or field.name in ['id', 'pk', 'polymorphic_ctype', 'unifiedjobtemplate_ptr', 'created_by', 'modified_by']
or field.name.endswith('_role')
):
create_kwargs.pop(field.name, None)
continue
if field.one_to_many:
@@ -926,33 +905,24 @@ class CopyAPIView(GenericAPIView):
elif field.name == 'name' and not old_parent:
create_kwargs[field.name] = copy_name or field_val + ' copy'
elif field.name in fields_to_preserve:
create_kwargs[field.name] = CopyAPIView._decrypt_model_field_if_needed(
obj, field.name, field_val
)
create_kwargs[field.name] = CopyAPIView._decrypt_model_field_if_needed(obj, field.name, field_val)
# WorkflowJobTemplateNodes that represent an approval are *special*;
# when we copy them, we actually want to *copy* the UJT they point at
# rather than share the template reference between nodes in disparate
# workflows
if (
isinstance(obj, WorkflowJobTemplateNode) and
isinstance(getattr(obj, 'unified_job_template'), WorkflowApprovalTemplate)
):
new_approval_template, sub_objs = CopyAPIView.copy_model_obj(
None, None, WorkflowApprovalTemplate,
obj.unified_job_template, creater
)
if isinstance(obj, WorkflowJobTemplateNode) and isinstance(getattr(obj, 'unified_job_template'), WorkflowApprovalTemplate):
new_approval_template, sub_objs = CopyAPIView.copy_model_obj(None, None, WorkflowApprovalTemplate, obj.unified_job_template, creater)
create_kwargs['unified_job_template'] = new_approval_template
new_obj = model.objects.create(**create_kwargs)
logger.debug('Deep copy: Created new object {}({})'.format(
new_obj, model
))
logger.debug('Deep copy: Created new object {}({})'.format(new_obj, model))
# Need to save separatedly because Djang-crum get_current_user would
# not work properly in non-request-response-cycle context.
new_obj.created_by = creater
new_obj.save()
from awx.main.signals import disable_activity_stream
with disable_activity_stream():
for m2m in m2m_to_preserve:
for related_obj in m2m_to_preserve[m2m].all():
@@ -978,8 +948,7 @@ class CopyAPIView(GenericAPIView):
for key in create_kwargs:
create_kwargs[key] = getattr(create_kwargs[key], 'pk', None) or create_kwargs[key]
try:
can_copy = request.user.can_access(self.model, 'add', create_kwargs) and \
request.user.can_access(self.model, 'copy_related', obj)
can_copy = request.user.can_access(self.model, 'add', create_kwargs) and request.user.can_access(self.model, 'copy_related', obj)
except PermissionDenied:
return Response({'can_copy': False})
return Response({'can_copy': can_copy})
@@ -998,8 +967,7 @@ class CopyAPIView(GenericAPIView):
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
new_obj, sub_objs = CopyAPIView.copy_model_obj(
None, None, self.model, obj, request.user, create_kwargs=create_kwargs,
copy_name=serializer.validated_data.get('name', '')
None, None, self.model, obj, request.user, create_kwargs=create_kwargs, copy_name=serializer.validated_data.get('name', '')
)
if hasattr(new_obj, 'admin_role') and request.user not in new_obj.admin_role.members.all():
new_obj.admin_role.members.add(request.user)
@@ -1011,13 +979,9 @@ class CopyAPIView(GenericAPIView):
cache.set(key, sub_objs, timeout=3600)
permission_check_func = None
if hasattr(type(self), 'deep_copy_permission_check_func'):
permission_check_func = (
type(self).__module__, type(self).__name__, 'deep_copy_permission_check_func'
)
permission_check_func = (type(self).__module__, type(self).__name__, 'deep_copy_permission_check_func')
trigger_delayed_deep_copy(
self.model.__module__, self.model.__name__,
obj.pk, new_obj.pk, request.user.pk, key,
permission_check_func=permission_check_func
self.model.__module__, self.model.__name__, obj.pk, new_obj.pk, request.user.pk, key, permission_check_func=permission_check_func
)
serializer = self._get_copy_return_serializer(new_obj)
headers = {'Location': new_obj.get_absolute_url(request=request)}
@@ -1026,7 +990,7 @@ class CopyAPIView(GenericAPIView):
class BaseUsersList(SubListCreateAttachDetachAPIView):
def post(self, request, *args, **kwargs):
ret = super(BaseUsersList, self).post( request, *args, **kwargs)
ret = super(BaseUsersList, self).post(request, *args, **kwargs)
if ret.status_code != 201:
return ret
try:

View File

@@ -24,22 +24,30 @@ 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
# Polymorphic
from polymorphic.models import PolymorphicModel
class Metadata(metadata.SimpleMetadata):
def get_field_info(self, field):
field_info = OrderedDict()
field_info['type'] = self.label_lookup[field]
field_info['required'] = getattr(field, 'required', False)
text_attrs = [
'read_only', 'label', 'help_text',
'min_length', 'max_length',
'min_value', 'max_value',
'category', 'category_slug',
'defined_in_file', 'unit',
'read_only',
'label',
'help_text',
'min_length',
'max_length',
'min_value',
'max_value',
'category',
'category_slug',
'defined_in_file',
'unit',
]
for attr in text_attrs:
@@ -61,8 +69,9 @@ class Metadata(metadata.SimpleMetadata):
'type': _('Data type for this {}.'),
'url': _('URL for this {}.'),
'related': _('Data structure with URLs of related resources.'),
'summary_fields': _('Data structure with name/description for related resources. '
'The output for some objects may be limited for performance reasons.'),
'summary_fields': _(
'Data structure with name/description for related resources. ' 'The output for some objects may be limited for performance reasons.'
),
'created': _('Timestamp when this {} was created.'),
'modified': _('Timestamp when this {} was last modified.'),
}
@@ -72,7 +81,9 @@ class Metadata(metadata.SimpleMetadata):
field_info['help_text'] = field_help_text[field.field_name].format(verbose_name)
if field.field_name == 'type':
field_info['filterable'] = True
# Only include model classes with `type` field.
if issubclass(serializer.Meta.model, PolymorphicModel):
field_info['filterable'] = True
else:
for model_field in serializer.Meta.model._meta.fields:
if field.field_name == model_field.name:
@@ -101,9 +112,7 @@ class Metadata(metadata.SimpleMetadata):
field_info['children'] = self.get_serializer_info(field)
if not isinstance(field, (RelatedField, ManyRelatedField)) and hasattr(field, 'choices'):
choices = [
(choice_value, choice_name) for choice_value, choice_name in field.choices.items()
]
choices = [(choice_value, choice_name) for choice_value, choice_name in field.choices.items()]
if not any(choice in ('', None) for choice, _ in choices):
if field.allow_blank:
choices = [("", "---------")] + choices
@@ -131,7 +140,6 @@ class Metadata(metadata.SimpleMetadata):
for (notification_type_name, notification_tr_name, notification_type_class) in NotificationTemplate.NOTIFICATION_TYPES:
field_info[notification_type_name] = notification_type_class.default_messages
# Update type of fields returned...
model_field = None
if serializer and hasattr(serializer, 'Meta') and hasattr(serializer.Meta, 'model'):
@@ -149,22 +157,19 @@ class Metadata(metadata.SimpleMetadata):
field_info['type'] = 'integer'
elif field.field_name in ('created', 'modified'):
field_info['type'] = 'datetime'
elif (
RelatedField in field.__class__.__bases__ or
isinstance(model_field, ForeignKey)
):
elif RelatedField in field.__class__.__bases__ or isinstance(model_field, ForeignKey):
field_info['type'] = 'id'
elif (
isinstance(field, JSONField) or
isinstance(model_field, JSONField) or
isinstance(field, DRFJSONField) or
isinstance(getattr(field, 'model_field', None), JSONField) or
field.field_name == 'credential_passwords'
isinstance(field, JSONField)
or isinstance(model_field, JSONField)
or isinstance(field, DRFJSONField)
or isinstance(getattr(field, 'model_field', None), JSONField)
or field.field_name == 'credential_passwords'
):
field_info['type'] = 'json'
elif (
isinstance(field, ManyRelatedField) and
field.field_name == 'credentials'
isinstance(field, ManyRelatedField)
and field.field_name == 'credentials'
# launch-time credentials
):
field_info['type'] = 'list_of_ids'
@@ -175,10 +180,7 @@ class Metadata(metadata.SimpleMetadata):
def get_serializer_info(self, serializer, method=None):
filterer = getattr(serializer, 'filter_field_metadata', lambda fields, method: fields)
return filterer(
super(Metadata, self).get_serializer_info(serializer),
method
)
return filterer(super(Metadata, self).get_serializer_info(serializer), method)
def determine_actions(self, request, view):
# Add field information for GET requests (so field names/labels are
@@ -209,7 +211,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'):
@@ -274,6 +276,7 @@ class Metadata(metadata.SimpleMetadata):
metadata['object_roles'] = roles
from rest_framework import generics
if isinstance(view, generics.ListAPIView) and hasattr(view, 'paginator'):
metadata['max_page_size'] = view.paginator.max_page_size
@@ -293,7 +296,6 @@ class RoleMetadata(Metadata):
class SublistAttachDetatchMetadata(Metadata):
def determine_actions(self, request, view):
actions = super(SublistAttachDetatchMetadata, self).determine_actions(request, view)
method = 'POST'

View File

@@ -3,13 +3,9 @@
from django.conf.urls import url
from awx.api.views import (
MetricsView
)
from awx.api.views import MetricsView
urls = [
url(r'^$', MetricsView.as_view(), name='metrics_view'),
]
urls = [url(r'^$', MetricsView.as_view(), name='metrics_view')]
__all__ = ['urls']

View File

@@ -10,7 +10,6 @@ from rest_framework.utils.urls import replace_query_param
class DisabledPaginator(DjangoPaginator):
@property
def num_pages(self):
return 1
@@ -49,8 +48,7 @@ class Pagination(pagination.PageNumberPagination):
def get_html_context(self):
context = super().get_html_context()
context['page_links'] = [pl._replace(url=self.cap_page_size(pl.url))
for pl in context['page_links']]
context['page_links'] = [pl._replace(url=self.cap_page_size(pl.url)) for pl in context['page_links']]
return context

View File

@@ -15,16 +15,25 @@ from awx.main.utils import get_object_or_400
logger = logging.getLogger('awx.api.permissions')
__all__ = ['ModelAccessPermission', 'JobTemplateCallbackPermission', 'VariableDataPermission',
'TaskPermission', 'ProjectUpdatePermission', 'InventoryInventorySourcesUpdatePermission',
'UserPermission', 'IsSuperUser', 'InstanceGroupTowerPermission', 'WorkflowApprovalPermission']
__all__ = [
'ModelAccessPermission',
'JobTemplateCallbackPermission',
'VariableDataPermission',
'TaskPermission',
'ProjectUpdatePermission',
'InventoryInventorySourcesUpdatePermission',
'UserPermission',
'IsSuperUser',
'InstanceGroupTowerPermission',
'WorkflowApprovalPermission',
]
class ModelAccessPermission(permissions.BasePermission):
'''
"""
Default permissions class to check user access based on the model and
request method, optionally verifying the request data.
'''
"""
def check_options_permissions(self, request, view, obj=None):
return self.check_get_permissions(request, view, obj)
@@ -35,8 +44,7 @@ class ModelAccessPermission(permissions.BasePermission):
def check_get_permissions(self, request, view, obj=None):
if hasattr(view, 'parent_model'):
parent_obj = view.get_parent_object()
if not check_user_access(request.user, view.parent_model, 'read',
parent_obj):
if not check_user_access(request.user, view.parent_model, 'read', parent_obj):
return False
if not obj:
return True
@@ -45,8 +53,7 @@ class ModelAccessPermission(permissions.BasePermission):
def check_post_permissions(self, request, view, obj=None):
if hasattr(view, 'parent_model'):
parent_obj = view.get_parent_object()
if not check_user_access(request.user, view.parent_model, 'read',
parent_obj):
if not check_user_access(request.user, view.parent_model, 'read', parent_obj):
return False
if hasattr(view, 'parent_key'):
if not check_user_access(request.user, view.model, 'add', {view.parent_key: parent_obj}):
@@ -60,10 +67,7 @@ class ModelAccessPermission(permissions.BasePermission):
extra_kwargs = {}
if view.obj_permission_type == 'admin':
extra_kwargs['data'] = {}
return check_user_access(
request.user, view.model, view.obj_permission_type, obj,
**extra_kwargs
)
return check_user_access(request.user, view.model, view.obj_permission_type, obj, **extra_kwargs)
else:
if obj:
return True
@@ -74,8 +78,7 @@ class ModelAccessPermission(permissions.BasePermission):
# FIXME: For some reason this needs to return True
# because it is first called with obj=None?
return True
return check_user_access(request.user, view.model, 'change', obj,
request.data)
return check_user_access(request.user, view.model, 'change', obj, request.data)
def check_patch_permissions(self, request, view, obj=None):
return self.check_put_permissions(request, view, obj)
@@ -89,10 +92,10 @@ class ModelAccessPermission(permissions.BasePermission):
return check_user_access(request.user, view.model, 'delete', obj)
def check_permissions(self, request, view, obj=None):
'''
"""
Perform basic permissions checking before delegating to the appropriate
method based on the request method.
'''
"""
# Don't allow anonymous users. 401, not 403, hence no raised exception.
if not request.user or request.user.is_anonymous:
@@ -117,9 +120,7 @@ class ModelAccessPermission(permissions.BasePermission):
return result
def has_permission(self, request, view, obj=None):
logger.debug('has_permission(user=%s method=%s data=%r, %s, %r)',
request.user, request.method, request.data,
view.__class__.__name__, obj)
logger.debug('has_permission(user=%s method=%s data=%r, %s, %r)', request.user, request.method, request.data, view.__class__.__name__, obj)
try:
response = self.check_permissions(request, view, obj)
except Exception as e:
@@ -134,10 +135,10 @@ class ModelAccessPermission(permissions.BasePermission):
class JobTemplateCallbackPermission(ModelAccessPermission):
'''
"""
Permission check used by job template callback view for requests from
empheral hosts.
'''
"""
def has_permission(self, request, view, obj=None):
# If another authentication method was used and it's not a POST, return
@@ -160,18 +161,16 @@ class JobTemplateCallbackPermission(ModelAccessPermission):
class VariableDataPermission(ModelAccessPermission):
def check_put_permissions(self, request, view, obj=None):
if not obj:
return True
return check_user_access(request.user, view.model, 'change', obj,
dict(variables=request.data))
return check_user_access(request.user, view.model, 'change', obj, dict(variables=request.data))
class TaskPermission(ModelAccessPermission):
'''
"""
Permission checks used for API callbacks from running a task.
'''
"""
def has_permission(self, request, view, obj=None):
# If another authentication method was used other than the one for
@@ -182,8 +181,7 @@ class TaskPermission(ModelAccessPermission):
# Verify that the ID present in the auth token is for a valid, active
# unified job.
try:
unified_job = UnifiedJob.objects.get(status='running',
pk=int(request.auth.split('-')[0]))
unified_job = UnifiedJob.objects.get(status='running', pk=int(request.auth.split('-')[0]))
except (UnifiedJob.DoesNotExist, TypeError):
return False
@@ -197,10 +195,10 @@ class TaskPermission(ModelAccessPermission):
class WorkflowApprovalPermission(ModelAccessPermission):
'''
"""
Permission check used by workflow `approval` and `deny` views to determine
who has access to approve and deny paused workflow nodes
'''
"""
def check_post_permissions(self, request, view, obj=None):
approval = get_object_or_400(view.model, pk=view.kwargs['pk'])
@@ -208,9 +206,10 @@ class WorkflowApprovalPermission(ModelAccessPermission):
class ProjectUpdatePermission(ModelAccessPermission):
'''
"""
Permission check used by ProjectUpdateView to determine who can update projects
'''
"""
def check_get_permissions(self, request, view, obj=None):
project = get_object_or_400(view.model, pk=view.kwargs['pk'])
return check_user_access(request.user, view.model, 'read', project)

View File

@@ -11,7 +11,6 @@ from rest_framework.utils import encoders
class SurrogateEncoder(encoders.JSONEncoder):
def encode(self, obj):
ret = super(SurrogateEncoder, self).encode(obj)
try:
@@ -28,9 +27,9 @@ class DefaultJSONRenderer(renderers.JSONRenderer):
class BrowsableAPIRenderer(renderers.BrowsableAPIRenderer):
'''
"""
Customizations to the default browsable API renderer.
'''
"""
def get_default_renderer(self, view):
renderer = super(BrowsableAPIRenderer, self).get_default_renderer(view)
@@ -48,9 +47,7 @@ class BrowsableAPIRenderer(renderers.BrowsableAPIRenderer):
# see: https://github.com/ansible/awx/issues/3108
# https://code.djangoproject.com/ticket/28121
return data
return super(BrowsableAPIRenderer, self).get_content(renderer, data,
accepted_media_type,
renderer_context)
return super(BrowsableAPIRenderer, self).get_content(renderer, data, accepted_media_type, renderer_context)
def get_context(self, data, accepted_media_type, renderer_context):
# Store the associated response status to know how to populate the raw
@@ -125,18 +122,25 @@ class AnsiDownloadRenderer(PlainTextRenderer):
class PrometheusJSONRenderer(renderers.JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
if isinstance(data, dict):
# HTTP errors are {'detail': ErrorDetail(string='...', code=...)}
return super(PrometheusJSONRenderer, self).render(
data, accepted_media_type, renderer_context
)
return super(PrometheusJSONRenderer, self).render(data, accepted_media_type, renderer_context)
parsed_metrics = text_string_to_metric_families(data)
data = {}
for family in parsed_metrics:
data[family.name] = {}
data[family.name]['help_text'] = family.documentation
data[family.name]['type'] = family.type
data[family.name]['samples'] = []
for sample in family.samples:
data[sample[0]] = {"labels": sample[1], "value": sample[2]}
return super(PrometheusJSONRenderer, self).render(
data, accepted_media_type, renderer_context
)
sample_dict = {"labels": sample[1], "value": sample[2]}
if family.type == 'histogram':
if sample[0].endswith("_sum"):
sample_dict['sample_type'] = "sum"
elif sample[0].endswith("_count"):
sample_dict['sample_type'] = "count"
elif sample[0].endswith("_bucket"):
sample_dict['sample_type'] = "bucket"
data[family.name]['samples'].append(sample_dict)
return super(PrometheusJSONRenderer, self).render(data, accepted_media_type, renderer_context)

File diff suppressed because it is too large Load Diff

View File

@@ -14,7 +14,6 @@ from rest_framework_swagger import renderers
class SuperUserSchemaGenerator(SchemaGenerator):
def has_view_permissions(self, path, method, view):
#
# Generate the Swagger schema as if you were a superuser and
@@ -25,17 +24,17 @@ class SuperUserSchemaGenerator(SchemaGenerator):
class AutoSchema(DRFAuthSchema):
def get_link(self, path, method, base_url):
link = super(AutoSchema, self).get_link(path, method, base_url)
try:
serializer = self.view.get_serializer()
except Exception:
serializer = None
warnings.warn('{}.get_serializer() raised an exception during '
'schema generation. Serializer fields will not be '
'generated for {} {}.'
.format(self.view.__class__.__name__, method, path))
warnings.warn(
'{}.get_serializer() raised an exception during '
'schema generation. Serializer fields will not be '
'generated for {} {}.'.format(self.view.__class__.__name__, method, path)
)
link.__dict__['deprecated'] = getattr(self.view, 'deprecated', False)
@@ -43,9 +42,7 @@ class AutoSchema(DRFAuthSchema):
if hasattr(self.view, 'swagger_topic'):
link.__dict__['topic'] = str(self.view.swagger_topic).title()
elif serializer and hasattr(serializer, 'Meta'):
link.__dict__['topic'] = str(
serializer.Meta.model._meta.verbose_name_plural
).title()
link.__dict__['topic'] = str(serializer.Meta.model._meta.verbose_name_plural).title()
elif hasattr(self.view, 'model'):
link.__dict__['topic'] = str(self.view.model._meta.verbose_name_plural).title()
else:
@@ -62,18 +59,10 @@ class SwaggerSchemaView(APIView):
_ignore_model_permissions = True
exclude_from_schema = True
permission_classes = [AllowAny]
renderer_classes = [
CoreJSONRenderer,
renderers.OpenAPIRenderer,
renderers.SwaggerUIRenderer
]
renderer_classes = [CoreJSONRenderer, renderers.OpenAPIRenderer, renderers.SwaggerUIRenderer]
def get(self, request):
generator = SuperUserSchemaGenerator(
title='Ansible Tower API',
patterns=None,
urlconf=None
)
generator = SuperUserSchemaGenerator(title='Ansible Automation Platform controller API', patterns=None, urlconf=None)
schema = generator.get_schema(request=request)
# python core-api doesn't support the deprecation yet, so track it
# ourselves and return it in a response header
@@ -103,11 +92,6 @@ class SwaggerSchemaView(APIView):
schema._data[topic]._data[path] = node
if not schema:
raise exceptions.ValidationError(
'The schema generator did not return a schema Document'
)
raise exceptions.ValidationError('The schema generator did not return a schema Document')
return Response(
schema,
headers={'X-Deprecated-Paths': json.dumps(_deprecated)}
)
return Response(schema, headers={'X-Deprecated-Paths': json.dumps(_deprecated)})

View File

@@ -0,0 +1 @@
query params to filter response, e.g., ?subsystemonly=1&metric=callback_receiver_events_insert_db&node=awx-1

View File

@@ -3,10 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
ActivityStreamList,
ActivityStreamDetail,
)
from awx.api.views import ActivityStreamList, ActivityStreamDetail
urls = [

View File

@@ -3,10 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
AdHocCommandEventList,
AdHocCommandEventDetail,
)
from awx.api.views import AdHocCommandEventList, AdHocCommandEventDetail
urls = [

View File

@@ -3,10 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
CredentialInputSourceDetail,
CredentialInputSourceList,
)
from awx.api.views import CredentialInputSourceDetail, CredentialInputSourceList
urls = [

View File

@@ -3,13 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
CredentialTypeList,
CredentialTypeDetail,
CredentialTypeCredentialList,
CredentialTypeActivityStreamList,
CredentialTypeExternalTest,
)
from awx.api.views import CredentialTypeList, CredentialTypeDetail, CredentialTypeCredentialList, CredentialTypeActivityStreamList, CredentialTypeExternalTest
urls = [

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

@@ -3,20 +3,14 @@
from django.conf.urls import url
from awx.api.views import (
InstanceList,
InstanceDetail,
InstanceUnifiedJobsList,
InstanceInstanceGroupsList,
)
from awx.api.views import InstanceList, InstanceDetail, InstanceUnifiedJobsList, InstanceInstanceGroupsList
urls = [
url(r'^$', InstanceList.as_view(), name='instance_list'),
url(r'^(?P<pk>[0-9]+)/$', InstanceDetail.as_view(), name='instance_detail'),
url(r'^(?P<pk>[0-9]+)/jobs/$', InstanceUnifiedJobsList.as_view(), name='instance_unified_jobs_list'),
url(r'^(?P<pk>[0-9]+)/instance_groups/$', InstanceInstanceGroupsList.as_view(),
name='instance_instance_groups_list'),
url(r'^(?P<pk>[0-9]+)/instance_groups/$', InstanceInstanceGroupsList.as_view(), name='instance_instance_groups_list'),
]
__all__ = ['urls']

View File

@@ -3,12 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
InstanceGroupList,
InstanceGroupDetail,
InstanceGroupUnifiedJobsList,
InstanceGroupInstanceList,
)
from awx.api.views import InstanceGroupList, InstanceGroupDetail, InstanceGroupUnifiedJobsList, InstanceGroupInstanceList
urls = [

View File

@@ -1,21 +0,0 @@
# Copyright (c) 2017 Ansible, Inc.
# All Rights Reserved.
from django.conf.urls import url
from awx.api.views import (
InventoryScriptList,
InventoryScriptDetail,
InventoryScriptObjectRolesList,
InventoryScriptCopy,
)
urls = [
url(r'^$', InventoryScriptList.as_view(), name='inventory_script_list'),
url(r'^(?P<pk>[0-9]+)/$', InventoryScriptDetail.as_view(), name='inventory_script_detail'),
url(r'^(?P<pk>[0-9]+)/object_roles/$', InventoryScriptObjectRolesList.as_view(), name='inventory_script_object_roles_list'),
url(r'^(?P<pk>[0-9]+)/copy/$', InventoryScriptCopy.as_view(), name='inventory_script_copy'),
]
__all__ = ['urls']

View File

@@ -29,12 +29,21 @@ urls = [
url(r'^(?P<pk>[0-9]+)/credentials/$', InventorySourceCredentialsList.as_view(), name='inventory_source_credentials_list'),
url(r'^(?P<pk>[0-9]+)/groups/$', InventorySourceGroupsList.as_view(), name='inventory_source_groups_list'),
url(r'^(?P<pk>[0-9]+)/hosts/$', InventorySourceHostsList.as_view(), name='inventory_source_hosts_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_started/$', InventorySourceNotificationTemplatesStartedList.as_view(),
name='inventory_source_notification_templates_started_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_error/$', InventorySourceNotificationTemplatesErrorList.as_view(),
name='inventory_source_notification_templates_error_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_success/$', InventorySourceNotificationTemplatesSuccessList.as_view(),
name='inventory_source_notification_templates_success_list'),
url(
r'^(?P<pk>[0-9]+)/notification_templates_started/$',
InventorySourceNotificationTemplatesStartedList.as_view(),
name='inventory_source_notification_templates_started_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_error/$',
InventorySourceNotificationTemplatesErrorList.as_view(),
name='inventory_source_notification_templates_error_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_success/$',
InventorySourceNotificationTemplatesSuccessList.as_view(),
name='inventory_source_notification_templates_success_list',
),
]
__all__ = ['urls']

View File

@@ -3,12 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
JobEventList,
JobEventDetail,
JobEventChildrenList,
JobEventHostsList,
)
from awx.api.views import JobEventList, JobEventDetail, JobEventChildrenList, JobEventHostsList
urls = [

View File

@@ -3,13 +3,9 @@
from django.conf.urls import url
from awx.api.views import (
JobHostSummaryDetail,
)
from awx.api.views import JobHostSummaryDetail
urls = [
url(r'^(?P<pk>[0-9]+)/$', JobHostSummaryDetail.as_view(), name='job_host_summary_detail'),
]
urls = [url(r'^(?P<pk>[0-9]+)/$', JobHostSummaryDetail.as_view(), name='job_host_summary_detail')]
__all__ = ['urls']

View File

@@ -34,12 +34,21 @@ urls = [
url(r'^(?P<pk>[0-9]+)/schedules/$', JobTemplateSchedulesList.as_view(), name='job_template_schedules_list'),
url(r'^(?P<pk>[0-9]+)/survey_spec/$', JobTemplateSurveySpec.as_view(), name='job_template_survey_spec'),
url(r'^(?P<pk>[0-9]+)/activity_stream/$', JobTemplateActivityStreamList.as_view(), name='job_template_activity_stream_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_started/$', JobTemplateNotificationTemplatesStartedList.as_view(),
name='job_template_notification_templates_started_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_error/$', JobTemplateNotificationTemplatesErrorList.as_view(),
name='job_template_notification_templates_error_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_success/$', JobTemplateNotificationTemplatesSuccessList.as_view(),
name='job_template_notification_templates_success_list'),
url(
r'^(?P<pk>[0-9]+)/notification_templates_started/$',
JobTemplateNotificationTemplatesStartedList.as_view(),
name='job_template_notification_templates_started_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_error/$',
JobTemplateNotificationTemplatesErrorList.as_view(),
name='job_template_notification_templates_error_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_success/$',
JobTemplateNotificationTemplatesSuccessList.as_view(),
name='job_template_notification_templates_success_list',
),
url(r'^(?P<pk>[0-9]+)/instance_groups/$', JobTemplateInstanceGroupsList.as_view(), name='job_template_instance_groups_list'),
url(r'^(?P<pk>[0-9]+)/access_list/$', JobTemplateAccessList.as_view(), name='job_template_access_list'),
url(r'^(?P<pk>[0-9]+)/object_roles/$', JobTemplateObjectRolesList.as_view(), name='job_template_object_roles_list'),

View File

@@ -3,15 +3,9 @@
from django.conf.urls import url
from awx.api.views import (
LabelList,
LabelDetail,
)
from awx.api.views import LabelList, LabelDetail
urls = [
url(r'^$', LabelList.as_view(), name='label_list'),
url(r'^(?P<pk>[0-9]+)/$', LabelDetail.as_view(), name='label_detail'),
]
urls = [url(r'^$', LabelList.as_view(), name='label_list'), url(r'^(?P<pk>[0-9]+)/$', LabelDetail.as_view(), name='label_detail')]
__all__ = ['urls']

View File

@@ -3,15 +3,9 @@
from django.conf.urls import url
from awx.api.views import (
NotificationList,
NotificationDetail,
)
from awx.api.views import NotificationList, NotificationDetail
urls = [
url(r'^$', NotificationList.as_view(), name='notification_list'),
url(r'^(?P<pk>[0-9]+)/$', NotificationDetail.as_view(), name='notification_detail'),
]
urls = [url(r'^$', NotificationList.as_view(), name='notification_list'), url(r'^(?P<pk>[0-9]+)/$', NotificationDetail.as_view(), name='notification_detail')]
__all__ = ['urls']

View File

@@ -16,32 +16,12 @@ from awx.api.views import (
urls = [
url(r'^applications/$', OAuth2ApplicationList.as_view(), name='o_auth2_application_list'),
url(
r'^applications/(?P<pk>[0-9]+)/$',
OAuth2ApplicationDetail.as_view(),
name='o_auth2_application_detail'
),
url(
r'^applications/(?P<pk>[0-9]+)/tokens/$',
ApplicationOAuth2TokenList.as_view(),
name='o_auth2_application_token_list'
),
url(
r'^applications/(?P<pk>[0-9]+)/activity_stream/$',
OAuth2ApplicationActivityStreamList.as_view(),
name='o_auth2_application_activity_stream_list'
),
url(r'^applications/(?P<pk>[0-9]+)/$', OAuth2ApplicationDetail.as_view(), name='o_auth2_application_detail'),
url(r'^applications/(?P<pk>[0-9]+)/tokens/$', ApplicationOAuth2TokenList.as_view(), name='o_auth2_application_token_list'),
url(r'^applications/(?P<pk>[0-9]+)/activity_stream/$', OAuth2ApplicationActivityStreamList.as_view(), name='o_auth2_application_activity_stream_list'),
url(r'^tokens/$', OAuth2TokenList.as_view(), name='o_auth2_token_list'),
url(
r'^tokens/(?P<pk>[0-9]+)/$',
OAuth2TokenDetail.as_view(),
name='o_auth2_token_detail'
),
url(
r'^tokens/(?P<pk>[0-9]+)/activity_stream/$',
OAuth2TokenActivityStreamList.as_view(),
name='o_auth2_token_activity_stream_list'
),
url(r'^tokens/(?P<pk>[0-9]+)/$', OAuth2TokenDetail.as_view(), name='o_auth2_token_detail'),
url(r'^tokens/(?P<pk>[0-9]+)/activity_stream/$', OAuth2TokenActivityStreamList.as_view(), name='o_auth2_token_activity_stream_list'),
]
__all__ = ['urls']

View File

@@ -10,13 +10,10 @@ from oauthlib import oauth2
from oauth2_provider import views
from awx.main.models import RefreshToken
from awx.api.views import (
ApiOAuthAuthorizationRootView,
)
from awx.api.views import ApiOAuthAuthorizationRootView
class TokenView(views.TokenView):
def create_token_response(self, request):
# Django OAuth2 Toolkit has a bug whereby refresh tokens are *never*
# properly expired (ugh):
@@ -26,9 +23,7 @@ class TokenView(views.TokenView):
# This code detects and auto-expires them on refresh grant
# requests.
if request.POST.get('grant_type') == 'refresh_token' and 'refresh_token' in request.POST:
refresh_token = RefreshToken.objects.filter(
token=request.POST['refresh_token']
).first()
refresh_token = RefreshToken.objects.filter(token=request.POST['refresh_token']).first()
if refresh_token:
expire_seconds = settings.OAUTH2_PROVIDER.get('REFRESH_TOKEN_EXPIRE_SECONDS', 0)
if refresh_token.created + timedelta(seconds=expire_seconds) < now():

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'),
@@ -41,14 +43,26 @@ urls = [
url(r'^(?P<pk>[0-9]+)/credentials/$', OrganizationCredentialList.as_view(), name='organization_credential_list'),
url(r'^(?P<pk>[0-9]+)/activity_stream/$', OrganizationActivityStreamList.as_view(), name='organization_activity_stream_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates/$', OrganizationNotificationTemplatesList.as_view(), name='organization_notification_templates_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_started/$', OrganizationNotificationTemplatesStartedList.as_view(),
name='organization_notification_templates_started_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_error/$', OrganizationNotificationTemplatesErrorList.as_view(),
name='organization_notification_templates_error_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_success/$', OrganizationNotificationTemplatesSuccessList.as_view(),
name='organization_notification_templates_success_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_approvals/$', OrganizationNotificationTemplatesApprovalList.as_view(),
name='organization_notification_templates_approvals_list'),
url(
r'^(?P<pk>[0-9]+)/notification_templates_started/$',
OrganizationNotificationTemplatesStartedList.as_view(),
name='organization_notification_templates_started_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_error/$',
OrganizationNotificationTemplatesErrorList.as_view(),
name='organization_notification_templates_error_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_success/$',
OrganizationNotificationTemplatesSuccessList.as_view(),
name='organization_notification_templates_success_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_approvals/$',
OrganizationNotificationTemplatesApprovalList.as_view(),
name='organization_notification_templates_approvals_list',
),
url(r'^(?P<pk>[0-9]+)/instance_groups/$', OrganizationInstanceGroupsList.as_view(), name='organization_instance_groups_list'),
url(r'^(?P<pk>[0-9]+)/galaxy_credentials/$', OrganizationGalaxyCredentialsList.as_view(), name='organization_galaxy_credentials_list'),
url(r'^(?P<pk>[0-9]+)/object_roles/$', OrganizationObjectRolesList.as_view(), name='organization_object_roles_list'),

View File

@@ -35,10 +35,16 @@ urls = [
url(r'^(?P<pk>[0-9]+)/activity_stream/$', ProjectActivityStreamList.as_view(), name='project_activity_stream_list'),
url(r'^(?P<pk>[0-9]+)/schedules/$', ProjectSchedulesList.as_view(), name='project_schedules_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_error/$', ProjectNotificationTemplatesErrorList.as_view(), name='project_notification_templates_error_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_success/$', ProjectNotificationTemplatesSuccessList.as_view(),
name='project_notification_templates_success_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_started/$', ProjectNotificationTemplatesStartedList.as_view(),
name='project_notification_templates_started_list'),
url(
r'^(?P<pk>[0-9]+)/notification_templates_success/$',
ProjectNotificationTemplatesSuccessList.as_view(),
name='project_notification_templates_success_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_started/$',
ProjectNotificationTemplatesStartedList.as_view(),
name='project_notification_templates_started_list',
),
url(r'^(?P<pk>[0-9]+)/object_roles/$', ProjectObjectRolesList.as_view(), name='project_object_roles_list'),
url(r'^(?P<pk>[0-9]+)/access_list/$', ProjectAccessList.as_view(), name='project_access_list'),
url(r'^(?P<pk>[0-9]+)/copy/$', ProjectCopy.as_view(), name='project_copy'),

View File

@@ -3,14 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
RoleList,
RoleDetail,
RoleUsersList,
RoleTeamsList,
RoleParentsList,
RoleChildrenList,
)
from awx.api.views import RoleList, RoleDetail, RoleUsersList, RoleTeamsList, RoleParentsList, RoleChildrenList
urls = [

View File

@@ -3,12 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
ScheduleList,
ScheduleDetail,
ScheduleUnifiedJobsList,
ScheduleCredentialsList,
)
from awx.api.views import ScheduleList, ScheduleDetail, ScheduleUnifiedJobsList, ScheduleCredentialsList
urls = [

View File

@@ -3,13 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
SystemJobList,
SystemJobDetail,
SystemJobCancel,
SystemJobNotificationsList,
SystemJobEventsList
)
from awx.api.views import SystemJobList, SystemJobDetail, SystemJobCancel, SystemJobNotificationsList, SystemJobEventsList
urls = [

View File

@@ -21,12 +21,21 @@ urls = [
url(r'^(?P<pk>[0-9]+)/launch/$', SystemJobTemplateLaunch.as_view(), name='system_job_template_launch'),
url(r'^(?P<pk>[0-9]+)/jobs/$', SystemJobTemplateJobsList.as_view(), name='system_job_template_jobs_list'),
url(r'^(?P<pk>[0-9]+)/schedules/$', SystemJobTemplateSchedulesList.as_view(), name='system_job_template_schedules_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_started/$', SystemJobTemplateNotificationTemplatesStartedList.as_view(),
name='system_job_template_notification_templates_started_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_error/$', SystemJobTemplateNotificationTemplatesErrorList.as_view(),
name='system_job_template_notification_templates_error_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_success/$', SystemJobTemplateNotificationTemplatesSuccessList.as_view(),
name='system_job_template_notification_templates_success_list'),
url(
r'^(?P<pk>[0-9]+)/notification_templates_started/$',
SystemJobTemplateNotificationTemplatesStartedList.as_view(),
name='system_job_template_notification_templates_started_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_error/$',
SystemJobTemplateNotificationTemplatesErrorList.as_view(),
name='system_job_template_notification_templates_error_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_success/$',
SystemJobTemplateNotificationTemplatesSuccessList.as_view(),
name='system_job_template_notification_templates_success_list',
),
]
__all__ = ['urls']

View File

@@ -5,10 +5,7 @@ from __future__ import absolute_import, unicode_literals
from django.conf import settings
from django.conf.urls import include, url
from awx.api.generics import (
LoggedLoginView,
LoggedLogoutView,
)
from awx.api.generics import LoggedLoginView, LoggedLogoutView
from awx.api.views import (
ApiRootView,
ApiV2RootView,
@@ -33,21 +30,19 @@ from awx.api.views import (
OAuth2ApplicationDetail,
)
from awx.api.views.metrics import (
MetricsView,
)
from awx.api.views.metrics import MetricsView
from .organization import urls as organization_urls
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
from .inventory_source import urls as inventory_source_urls
from .inventory_update import urls as inventory_update_urls
from .inventory_script import urls as inventory_script_urls
from .credential_type import urls as credential_type_urls
from .credential import urls as credential_urls
from .credential_input_source import urls as credential_input_source_urls
@@ -106,6 +101,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)),
@@ -114,7 +110,6 @@ v2_urls = [
url(r'^groups/', include(group_urls)),
url(r'^inventory_sources/', include(inventory_source_urls)),
url(r'^inventory_updates/', include(inventory_update_urls)),
url(r'^inventory_scripts/', include(inventory_script_urls)),
url(r'^credentials/', include(credential_urls)),
url(r'^roles/', include(role_urls)),
url(r'^job_templates/', include(job_template_urls)),
@@ -144,17 +139,11 @@ app_name = 'api'
urlpatterns = [
url(r'^$', ApiRootView.as_view(), name='api_root_view'),
url(r'^(?P<version>(v2))/', include(v2_urls)),
url(r'^login/$', LoggedLoginView.as_view(
template_name='rest_framework/login.html',
extra_context={'inside_login_context': True}
), name='login'),
url(r'^logout/$', LoggedLogoutView.as_view(
next_page='/api/', redirect_field_name='next'
), name='logout'),
url(r'^login/$', LoggedLoginView.as_view(template_name='rest_framework/login.html', extra_context={'inside_login_context': True}), name='login'),
url(r'^logout/$', LoggedLogoutView.as_view(next_page='/api/', redirect_field_name='next'), name='logout'),
url(r'^o/', include(oauth2_root_urls)),
]
if settings.SETTINGS_MODULE == 'awx.settings.development':
from awx.api.swagger import SwaggerSchemaView
urlpatterns += [
url(r'^swagger/$', SwaggerSchemaView.as_view(), name='swagger_view'),
]
urlpatterns += [url(r'^swagger/$', SwaggerSchemaView.as_view(), name='swagger_view')]

View File

@@ -20,7 +20,7 @@ from awx.api.views import (
UserAuthorizedTokenList,
)
urls = [
urls = [
url(r'^$', UserList.as_view(), name='user_list'),
url(r'^(?P<pk>[0-9]+)/$', UserDetail.as_view(), name='user_detail'),
url(r'^(?P<pk>[0-9]+)/teams/$', UserTeamsList.as_view(), name='user_teams_list'),
@@ -35,7 +35,6 @@ urls = [
url(r'^(?P<pk>[0-9]+)/tokens/$', OAuth2UserTokenList.as_view(), name='o_auth2_token_list'),
url(r'^(?P<pk>[0-9]+)/authorized_tokens/$', UserAuthorizedTokenList.as_view(), name='user_authorized_token_list'),
url(r'^(?P<pk>[0-9]+)/personal_tokens/$', UserPersonalTokenList.as_view(), name='user_personal_token_list'),
]
]
__all__ = ['urls']

View File

@@ -1,10 +1,6 @@
from django.conf.urls import url
from awx.api.views import (
WebhookKeyView,
GithubWebhookReceiver,
GitlabWebhookReceiver,
)
from awx.api.views import WebhookKeyView, GithubWebhookReceiver, GitlabWebhookReceiver
urlpatterns = [

View File

@@ -3,12 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
WorkflowApprovalList,
WorkflowApprovalDetail,
WorkflowApprovalApprove,
WorkflowApprovalDeny,
)
from awx.api.views import WorkflowApprovalList, WorkflowApprovalDetail, WorkflowApprovalApprove, WorkflowApprovalDeny
urls = [

View File

@@ -3,10 +3,7 @@
from django.conf.urls import url
from awx.api.views import (
WorkflowApprovalTemplateDetail,
WorkflowApprovalTemplateJobsList,
)
from awx.api.views import WorkflowApprovalTemplateDetail, WorkflowApprovalTemplateJobsList
urls = [

View File

@@ -33,14 +33,26 @@ urls = [
url(r'^(?P<pk>[0-9]+)/survey_spec/$', WorkflowJobTemplateSurveySpec.as_view(), name='workflow_job_template_survey_spec'),
url(r'^(?P<pk>[0-9]+)/workflow_nodes/$', WorkflowJobTemplateWorkflowNodesList.as_view(), name='workflow_job_template_workflow_nodes_list'),
url(r'^(?P<pk>[0-9]+)/activity_stream/$', WorkflowJobTemplateActivityStreamList.as_view(), name='workflow_job_template_activity_stream_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_started/$', WorkflowJobTemplateNotificationTemplatesStartedList.as_view(),
name='workflow_job_template_notification_templates_started_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_error/$', WorkflowJobTemplateNotificationTemplatesErrorList.as_view(),
name='workflow_job_template_notification_templates_error_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_success/$', WorkflowJobTemplateNotificationTemplatesSuccessList.as_view(),
name='workflow_job_template_notification_templates_success_list'),
url(r'^(?P<pk>[0-9]+)/notification_templates_approvals/$', WorkflowJobTemplateNotificationTemplatesApprovalList.as_view(),
name='workflow_job_template_notification_templates_approvals_list'),
url(
r'^(?P<pk>[0-9]+)/notification_templates_started/$',
WorkflowJobTemplateNotificationTemplatesStartedList.as_view(),
name='workflow_job_template_notification_templates_started_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_error/$',
WorkflowJobTemplateNotificationTemplatesErrorList.as_view(),
name='workflow_job_template_notification_templates_error_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_success/$',
WorkflowJobTemplateNotificationTemplatesSuccessList.as_view(),
name='workflow_job_template_notification_templates_success_list',
),
url(
r'^(?P<pk>[0-9]+)/notification_templates_approvals/$',
WorkflowJobTemplateNotificationTemplatesApprovalList.as_view(),
name='workflow_job_template_notification_templates_approvals_list',
),
url(r'^(?P<pk>[0-9]+)/access_list/$', WorkflowJobTemplateAccessList.as_view(), name='workflow_job_template_access_list'),
url(r'^(?P<pk>[0-9]+)/object_roles/$', WorkflowJobTemplateObjectRolesList.as_view(), name='workflow_job_template_object_roles_list'),
url(r'^(?P<pk>[0-9]+)/labels/$', WorkflowJobTemplateLabelList.as_view(), name='workflow_job_template_label_list'),

View File

@@ -40,13 +40,10 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra
class URLPathVersioning(BaseVersioning):
def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
if request.version is not None:
kwargs = {} if (kwargs is None) else kwargs
kwargs[self.version_param] = request.version
request = None
return super(BaseVersioning, self).reverse(
viewname, args, kwargs, request, format, **extra
)
return super(BaseVersioning, self).reverse(viewname, args, kwargs, request, format, **extra)

File diff suppressed because it is too large Load Diff

View File

@@ -25,17 +25,8 @@ from awx.main.models import (
InstanceGroup,
InventoryUpdateEvent,
InventoryUpdate,
InventorySource,
CustomInventoryScript,
)
from awx.api.generics import (
ListCreateAPIView,
RetrieveUpdateDestroyAPIView,
SubListAPIView,
SubListAttachDetachAPIView,
ResourceAccessList,
CopyAPIView,
)
from awx.api.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView, SubListAPIView, SubListAttachDetachAPIView, ResourceAccessList, CopyAPIView
from awx.api.serializers import (
InventorySerializer,
@@ -43,13 +34,9 @@ from awx.api.serializers import (
RoleSerializer,
InstanceGroupSerializer,
InventoryUpdateEventSerializer,
CustomInventoryScriptSerializer,
JobTemplateSerializer,
)
from awx.api.views.mixin import (
RelatedJobsPreventDeleteMixin,
ControlledByScmMixin,
)
from awx.api.views.mixin import RelatedJobsPreventDeleteMixin, ControlledByScmMixin
logger = logging.getLogger('awx.api.views.organization')
@@ -68,55 +55,6 @@ class InventoryUpdateEventsList(SubListAPIView):
return super(InventoryUpdateEventsList, self).finalize_response(request, response, *args, **kwargs)
class InventoryScriptList(ListCreateAPIView):
deprecated = True
model = CustomInventoryScript
serializer_class = CustomInventoryScriptSerializer
class InventoryScriptDetail(RetrieveUpdateDestroyAPIView):
deprecated = True
model = CustomInventoryScript
serializer_class = CustomInventoryScriptSerializer
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
can_delete = request.user.can_access(self.model, 'delete', instance)
if not can_delete:
raise PermissionDenied(_("Cannot delete inventory script."))
for inv_src in InventorySource.objects.filter(source_script=instance):
inv_src.source_script = None
inv_src.save()
return super(InventoryScriptDetail, self).destroy(request, *args, **kwargs)
class InventoryScriptObjectRolesList(SubListAPIView):
deprecated = True
model = Role
serializer_class = RoleSerializer
parent_model = CustomInventoryScript
search_fields = ('role_field', 'content_type__model',)
def get_queryset(self):
po = self.get_parent_object()
content_type = ContentType.objects.get_for_model(self.parent_model)
return Role.objects.filter(content_type=content_type, object_id=po.pk)
class InventoryScriptCopy(CopyAPIView):
deprecated = True
model = CustomInventoryScript
copy_return_serializer_class = CustomInventoryScriptSerializer
class InventoryList(ListCreateAPIView):
model = Inventory
@@ -134,8 +72,7 @@ class InventoryDetail(RelatedJobsPreventDeleteMixin, ControlledByScmMixin, Retri
# Do not allow changes to an Inventory kind.
if kind is not None and obj.kind != kind:
return Response(dict(error=_('You cannot turn a regular inventory into a "smart" inventory.')),
status=status.HTTP_405_METHOD_NOT_ALLOWED)
return Response(dict(error=_('You cannot turn a regular inventory into a "smart" inventory.')), status=status.HTTP_405_METHOD_NOT_ALLOWED)
return super(InventoryDetail, self).update(request, *args, **kwargs)
def destroy(self, request, *args, **kwargs):
@@ -175,7 +112,7 @@ class InventoryInstanceGroupsList(SubListAttachDetachAPIView):
class InventoryAccessList(ResourceAccessList):
model = User # needs to be User for AccessLists's
model = User # needs to be User for AccessLists's
parent_model = Inventory
@@ -184,7 +121,7 @@ class InventoryObjectRolesList(SubListAPIView):
model = Role
serializer_class = RoleSerializer
parent_model = Inventory
search_fields = ('role_field', 'content_type__model',)
search_fields = ('role_field', 'content_type__model')
def get_queryset(self):
po = self.get_parent_object()

View File

@@ -14,12 +14,11 @@ from rest_framework.exceptions import PermissionDenied
# AWX
# from awx.main.analytics import collectors
import awx.main.analytics.subsystem_metrics as s_metrics
from awx.main.analytics.metrics import metrics
from awx.api import renderers
from awx.api.generics import (
APIView,
)
from awx.api.generics import APIView
logger = logging.getLogger('awx.analytics')
@@ -30,13 +29,15 @@ class MetricsView(APIView):
name = _('Metrics')
swagger_topic = 'Metrics'
renderer_classes = [renderers.PlainTextRenderer,
renderers.PrometheusJSONRenderer,
renderers.BrowsableAPIRenderer,]
renderer_classes = [renderers.PlainTextRenderer, renderers.PrometheusJSONRenderer, renderers.BrowsableAPIRenderer]
def get(self, request):
''' Show Metrics Details '''
if (request.user.is_superuser or request.user.is_system_auditor):
return Response(metrics().decode('UTF-8'))
'''Show Metrics Details'''
if request.user.is_superuser or request.user.is_system_auditor:
metrics_to_show = ''
if not request.query_params.get('subsystemonly', "0") == "1":
metrics_to_show += metrics().decode('UTF-8')
if not request.query_params.get('dbonly', "0") == "1":
metrics_to_show += s_metrics.metrics(request)
return Response(metrics_to_show)
raise PermissionDenied()

View File

@@ -16,14 +16,8 @@ from rest_framework.response import Response
from rest_framework import status
from awx.main.constants import ACTIVE_STATES
from awx.main.utils import (
get_object_or_400,
parse_yaml_or_json,
)
from awx.main.models.ha import (
Instance,
InstanceGroup,
)
from awx.main.utils import get_object_or_400, parse_yaml_or_json
from awx.main.models.ha import Instance, InstanceGroup
from awx.main.models.organization import Team
from awx.main.models.projects import Project
from awx.main.models.inventory import Inventory
@@ -34,9 +28,10 @@ logger = logging.getLogger('awx.api.views.mixin')
class UnifiedJobDeletionMixin(object):
'''
"""
Special handling when deleting a running unified job object.
'''
"""
def destroy(self, request, *args, **kwargs):
obj = self.get_object()
if not request.user.can_access(self.model, 'delete', obj):
@@ -53,22 +48,21 @@ class UnifiedJobDeletionMixin(object):
# Prohibit deletion if job events are still coming in
if obj.finished and now() < obj.finished + dateutil.relativedelta.relativedelta(minutes=1):
# less than 1 minute has passed since job finished and events are not in
return Response({"error": _("Job has not finished processing events.")},
status=status.HTTP_400_BAD_REQUEST)
return Response({"error": _("Job has not finished processing events.")}, status=status.HTTP_400_BAD_REQUEST)
else:
# if it has been > 1 minute, events are probably lost
logger.warning('Allowing deletion of {} through the API without all events '
'processed.'.format(obj.log_format))
logger.warning('Allowing deletion of {} through the API without all events ' 'processed.'.format(obj.log_format))
obj.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
class InstanceGroupMembershipMixin(object):
'''
"""
This mixin overloads attach/detach so that it calls InstanceGroup.save(),
triggering a background recalculation of policy-based instance group
membership.
'''
"""
def attach(self, request, *args, **kwargs):
response = super(InstanceGroupMembershipMixin, self).attach(request, *args, **kwargs)
sub_id, res = self.attach_validate(request)
@@ -84,24 +78,13 @@ class InstanceGroupMembershipMixin(object):
ig_obj = get_object_or_400(ig_qs, pk=sub_id)
else:
# similar to get_parent_object, but selected for update
parent_filter = {
self.lookup_field: self.kwargs.get(self.lookup_field, None),
}
parent_filter = {self.lookup_field: self.kwargs.get(self.lookup_field, None)}
ig_obj = get_object_or_404(ig_qs, **parent_filter)
if inst_name not in ig_obj.policy_instance_list:
ig_obj.policy_instance_list.append(inst_name)
ig_obj.save(update_fields=['policy_instance_list'])
return response
def is_valid_relation(self, parent, sub, created=False):
if sub.is_isolated():
return {'error': _('Isolated instances may not be added or removed from instances groups via the API.')}
if self.parent_model is InstanceGroup:
ig_obj = self.get_parent_object()
if ig_obj.controller_id is not None:
return {'error': _('Isolated instance group membership may not be managed via the API.')}
return None
def unattach_validate(self, request):
(sub_id, res) = super(InstanceGroupMembershipMixin, self).unattach_validate(request)
if res:
@@ -126,9 +109,7 @@ class InstanceGroupMembershipMixin(object):
ig_obj = get_object_or_400(ig_qs, pk=sub_id)
else:
# similar to get_parent_object, but selected for update
parent_filter = {
self.lookup_field: self.kwargs.get(self.lookup_field, None),
}
parent_filter = {self.lookup_field: self.kwargs.get(self.lookup_field, None)}
ig_obj = get_object_or_404(ig_qs, **parent_filter)
if inst_name in ig_obj.policy_instance_list:
ig_obj.policy_instance_list.pop(ig_obj.policy_instance_list.index(inst_name))
@@ -146,16 +127,13 @@ class RelatedJobsPreventDeleteMixin(object):
if len(active_jobs) > 0:
raise ActiveJobConflict(active_jobs)
time_cutoff = now() - dateutil.relativedelta.relativedelta(minutes=1)
recent_jobs = obj._get_related_jobs().filter(finished__gte = time_cutoff)
recent_jobs = obj._get_related_jobs().filter(finished__gte=time_cutoff)
for unified_job in recent_jobs.get_real_instances():
if not unified_job.event_processing_finished:
raise PermissionDenied(_(
'Related job {} is still processing events.'
).format(unified_job.log_format))
raise PermissionDenied(_('Related job {} is still processing events.').format(unified_job.log_format))
class OrganizationCountsMixin(object):
def get_serializer_context(self, *args, **kwargs):
full_context = super(OrganizationCountsMixin, self).get_serializer_context(*args, **kwargs)
@@ -177,26 +155,23 @@ class OrganizationCountsMixin(object):
# Produce counts of Foreign Key relationships
db_results['inventories'] = inv_qs.values('organization').annotate(Count('organization')).order_by('organization')
db_results['teams'] = Team.accessible_objects(
self.request.user, 'read_role').values('organization').annotate(
Count('organization')).order_by('organization')
db_results['teams'] = (
Team.accessible_objects(self.request.user, 'read_role').values('organization').annotate(Count('organization')).order_by('organization')
)
db_results['job_templates'] = jt_qs.values('organization').annotate(Count('organization')).order_by('organization')
db_results['projects'] = project_qs.values('organization').annotate(Count('organization')).order_by('organization')
# Other members and admins of organization are always viewable
db_results['users'] = org_qs.annotate(
users=Count('member_role__members', distinct=True),
admins=Count('admin_role__members', distinct=True)
).values('id', 'users', 'admins')
db_results['users'] = org_qs.annotate(users=Count('member_role__members', distinct=True), admins=Count('admin_role__members', distinct=True)).values(
'id', 'users', 'admins'
)
count_context = {}
for org in org_id_list:
org_id = org['id']
count_context[org_id] = {
'inventories': 0, 'teams': 0, 'users': 0, 'job_templates': 0,
'admins': 0, 'projects': 0}
count_context[org_id] = {'inventories': 0, 'teams': 0, 'users': 0, 'job_templates': 0, 'admins': 0, 'projects': 0}
for res, count_qs in db_results.items():
if res == 'users':
@@ -218,21 +193,20 @@ class OrganizationCountsMixin(object):
class ControlledByScmMixin(object):
'''
"""
Special method to reset SCM inventory commit hash
if anything that it manages changes.
'''
"""
def _reset_inv_src_rev(self, obj):
if self.request.method in SAFE_METHODS or not obj:
return
project_following_sources = obj.inventory_sources.filter(
update_on_project_update=True, source='scm')
project_following_sources = obj.inventory_sources.filter(update_on_project_update=True, source='scm')
if project_following_sources:
# Allow inventory changes unrelated to variables
if self.model == Inventory and (
not self.request or not self.request.data or
parse_yaml_or_json(self.request.data.get('variables', '')) == parse_yaml_or_json(obj.variables)):
not self.request or not self.request.data or parse_yaml_or_json(self.request.data.get('variables', '')) == parse_yaml_or_json(obj.variables)
):
return
project_following_sources.update(scm_last_revision='')

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,
@@ -22,7 +24,7 @@ from awx.main.models import (
User,
Team,
InstanceGroup,
Credential
Credential,
)
from awx.api.generics import (
ListCreateAPIView,
@@ -44,13 +46,13 @@ from awx.api.serializers import (
RoleSerializer,
NotificationTemplateSerializer,
InstanceGroupSerializer,
ProjectSerializer, JobTemplateSerializer, WorkflowJobTemplateSerializer,
CredentialSerializer
)
from awx.api.views.mixin import (
RelatedJobsPreventDeleteMixin,
OrganizationCountsMixin,
ExecutionEnvironmentSerializer,
ProjectSerializer,
JobTemplateSerializer,
WorkflowJobTemplateSerializer,
CredentialSerializer,
)
from awx.api.views.mixin import RelatedJobsPreventDeleteMixin, OrganizationCountsMixin
logger = logging.getLogger('awx.api.views.organization')
@@ -81,23 +83,21 @@ class OrganizationDetail(RelatedJobsPreventDeleteMixin, RetrieveUpdateDestroyAPI
org_counts = {}
access_kwargs = {'accessor': self.request.user, 'role_field': 'read_role'}
direct_counts = Organization.objects.filter(id=org_id).annotate(
users=Count('member_role__members', distinct=True),
admins=Count('admin_role__members', distinct=True)
).values('users', 'admins')
direct_counts = (
Organization.objects.filter(id=org_id)
.annotate(users=Count('member_role__members', distinct=True), admins=Count('admin_role__members', distinct=True))
.values('users', 'admins')
)
if not direct_counts:
return full_context
org_counts = direct_counts[0]
org_counts['inventories'] = Inventory.accessible_objects(**access_kwargs).filter(
organization__id=org_id).count()
org_counts['teams'] = Team.accessible_objects(**access_kwargs).filter(
organization__id=org_id).count()
org_counts['projects'] = Project.accessible_objects(**access_kwargs).filter(
organization__id=org_id).count()
org_counts['job_templates'] = JobTemplate.accessible_objects(**access_kwargs).filter(
organization__id=org_id).count()
org_counts['inventories'] = Inventory.accessible_objects(**access_kwargs).filter(organization__id=org_id).count()
org_counts['teams'] = Team.accessible_objects(**access_kwargs).filter(organization__id=org_id).count()
org_counts['projects'] = Project.accessible_objects(**access_kwargs).filter(organization__id=org_id).count()
org_counts['job_templates'] = JobTemplate.accessible_objects(**access_kwargs).filter(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 +139,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
@@ -226,14 +236,12 @@ class OrganizationGalaxyCredentialsList(SubListAttachDetachAPIView):
def is_valid_relation(self, parent, sub, created=False):
if sub.kind != 'galaxy_api_token':
return {'msg': _(
f"Credential must be a Galaxy credential, not {sub.credential_type.name}."
)}
return {'msg': _(f"Credential must be a Galaxy credential, not {sub.credential_type.name}.")}
class OrganizationAccessList(ResourceAccessList):
model = User # needs to be User for AccessLists's
model = User # needs to be User for AccessLists's
parent_model = Organization
@@ -242,7 +250,7 @@ class OrganizationObjectRolesList(SubListAPIView):
model = Role
serializer_class = RoleSerializer
parent_model = Organization
search_fields = ('role_field', 'content_type__model',)
search_fields = ('role_field', 'content_type__model')
def get_queryset(self):
po = self.get_parent_object()

View File

@@ -24,22 +24,11 @@ from awx.api.generics import APIView
from awx.conf.registry import settings_registry
from awx.main.analytics import all_collectors
from awx.main.ha import is_ha_environment
from awx.main.utils import (
get_awx_version,
get_ansible_version,
get_custom_venv_choices,
to_python_boolean,
)
from awx.main.utils import get_awx_version, get_custom_venv_choices
from awx.main.utils.licensing import validate_entitlement_manifest
from awx.api.versioning import reverse, drf_reverse
from awx.main.constants import PRIVILEGE_ESCALATION_METHODS
from awx.main.models import (
Project,
Organization,
Instance,
InstanceGroup,
JobTemplate,
)
from awx.main.models import Project, Organization, Instance, InstanceGroup, JobTemplate
from awx.main.utils import set_environ
logger = logging.getLogger('awx.api.views.root')
@@ -54,13 +43,13 @@ class ApiRootView(APIView):
@method_decorator(ensure_csrf_cookie)
def get(self, request, format=None):
''' List supported API versions '''
'''List supported API versions'''
v2 = reverse('api:api_v2_root_view', kwargs={'version': 'v2'})
data = OrderedDict()
data['description'] = _('AWX REST API')
data['current_version'] = v2
data['available_versions'] = dict(v2 = v2)
data['available_versions'] = dict(v2=v2)
data['oauth2'] = drf_reverse('api:oauth_authorization_root_view')
data['custom_logo'] = settings.CUSTOM_LOGO
data['custom_login_info'] = settings.CUSTOM_LOGIN_INFO
@@ -89,7 +78,7 @@ class ApiVersionRootView(APIView):
swagger_topic = 'Versioning'
def get(self, request, format=None):
''' List top level resources '''
'''List top level resources'''
data = OrderedDict()
data['ping'] = reverse('api:api_v2_ping_view', request=request)
data['instances'] = reverse('api:instance_list', request=request)
@@ -100,6 +89,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)
@@ -110,7 +100,6 @@ class ApiVersionRootView(APIView):
data['tokens'] = reverse('api:o_auth2_token_list', request=request)
data['metrics'] = reverse('api:metrics_view', request=request)
data['inventory'] = reverse('api:inventory_list', request=request)
data['inventory_scripts'] = reverse('api:inventory_script_list', request=request)
data['inventory_sources'] = reverse('api:inventory_source_list', request=request)
data['inventory_updates'] = reverse('api:inventory_update_list', request=request)
data['groups'] = reverse('api:group_list', request=request)
@@ -145,6 +134,7 @@ class ApiV2PingView(APIView):
"""A simple view that reports very basic information about this
instance, which is acceptable to be public information.
"""
permission_classes = (AllowAny,)
authentication_classes = ()
name = _('Ping')
@@ -156,23 +146,19 @@ class ApiV2PingView(APIView):
Everything returned here should be considered public / insecure, as
this requires no auth and is intended for use by the installer process.
"""
response = {
'ha': is_ha_environment(),
'version': get_awx_version(),
'active_node': settings.CLUSTER_HOST_ID,
'install_uuid': settings.INSTALL_UUID,
}
response = {'ha': is_ha_environment(), 'version': get_awx_version(), 'active_node': settings.CLUSTER_HOST_ID, 'install_uuid': settings.INSTALL_UUID}
response['instances'] = []
for instance in Instance.objects.all():
response['instances'].append(dict(node=instance.hostname, uuid=instance.uuid, heartbeat=instance.modified,
capacity=instance.capacity, version=instance.version))
response['instances'].append(
dict(node=instance.hostname, uuid=instance.uuid, heartbeat=instance.modified, capacity=instance.capacity, version=instance.version)
)
sorted(response['instances'], key=operator.itemgetter('node'))
response['instance_groups'] = []
for instance_group in InstanceGroup.objects.prefetch_related('instances'):
response['instance_groups'].append(dict(name=instance_group.name,
capacity=instance_group.capacity,
instances=[x.hostname for x in instance_group.instances.all()]))
response['instance_groups'].append(
dict(name=instance_group.name, capacity=instance_group.capacity, instances=[x.hostname for x in instance_group.instances.all()])
)
return Response(response)
@@ -189,6 +175,7 @@ class ApiV2SubscriptionView(APIView):
def post(self, request):
from awx.main.utils.common import get_licenser
data = request.data.copy()
if data.get('subscriptions_password') == '$encrypted$':
data['subscriptions_password'] = settings.SUBSCRIPTIONS_PASSWORD
@@ -202,10 +189,7 @@ class ApiV2SubscriptionView(APIView):
settings.SUBSCRIPTIONS_PASSWORD = data['subscriptions_password']
except Exception as exc:
msg = _("Invalid Subscription")
if (
isinstance(exc, requests.exceptions.HTTPError) and
getattr(getattr(exc, 'response', None), 'status_code', None) == 401
):
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.")
@@ -214,8 +198,7 @@ class ApiV2SubscriptionView(APIView):
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))
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)
@@ -241,16 +224,14 @@ class ApiV2AttachView(APIView):
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
):
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.")
@@ -259,8 +240,7 @@ class ApiV2AttachView(APIView):
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))
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:
@@ -286,6 +266,7 @@ class ApiV2ConfigView(APIView):
'''Return various sitewide configuration settings'''
from awx.main.utils.common import get_licenser
license_data = get_licenser().validate()
if not license_data.get('valid_key', False):
@@ -297,7 +278,6 @@ class ApiV2ConfigView(APIView):
time_zone=settings.TIME_ZONE,
license_info=license_data,
version=get_awx_version(),
ansible_version=get_ansible_version(),
eula=render_to_string("eula.md") if license_data.get('license_type', 'UNLICENSED') != 'open' else '',
analytics_status=pendo_state,
analytics_collectors=all_collectors(),
@@ -313,43 +293,34 @@ class ApiV2ConfigView(APIView):
user_ldap_fields.extend(getattr(settings, 'AUTH_LDAP_USER_FLAGS_BY_GROUP', {}).keys())
data['user_ldap_fields'] = user_ldap_fields
if request.user.is_superuser \
or request.user.is_system_auditor \
or Organization.accessible_objects(request.user, 'admin_role').exists() \
or Organization.accessible_objects(request.user, 'auditor_role').exists() \
or Organization.accessible_objects(request.user, 'project_admin_role').exists():
data.update(dict(
project_base_dir = settings.PROJECTS_ROOT,
project_local_paths = Project.get_local_path_choices(),
custom_virtualenvs = get_custom_venv_choices()
))
if (
request.user.is_superuser
or request.user.is_system_auditor
or Organization.accessible_objects(request.user, 'admin_role').exists()
or Organization.accessible_objects(request.user, 'auditor_role').exists()
or Organization.accessible_objects(request.user, 'project_admin_role').exists()
):
data.update(
dict(
project_base_dir=settings.PROJECTS_ROOT, project_local_paths=Project.get_local_path_choices(), custom_virtualenvs=get_custom_venv_choices()
)
)
elif JobTemplate.accessible_objects(request.user, 'admin_role').exists():
data['custom_virtualenvs'] = get_custom_venv_choices()
return Response(data)
def post(self, request):
if not isinstance(request.data, dict):
return Response({"error": _("Invalid 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:
eula_accepted = to_python_boolean(request.data["eula_accepted"])
except ValueError:
return Response({"error": _("'eula_accepted' value is invalid")}, status=status.HTTP_400_BAD_REQUEST)
if not eula_accepted:
return Response({"error": _("'eula_accepted' must be True")}, status=status.HTTP_400_BAD_REQUEST)
request.data.pop("eula_accepted")
try:
data_actual = json.dumps(request.data)
except Exception:
logger.info(smart_text(u"Invalid JSON submitted for license."),
extra=dict(actor=request.user.username))
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)
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)
@@ -357,10 +328,7 @@ class ApiV2ConfigView(APIView):
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
)
return Response({"error": _('Legacy license submitted. A subscription manifest is now required.')}, status=status.HTTP_400_BAD_REQUEST)
except Exception:
pass
try:
@@ -374,8 +342,7 @@ class ApiV2ConfigView(APIView):
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))
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()
@@ -386,8 +353,7 @@ class ApiV2ConfigView(APIView):
settings.TOWER_URL_BASE = "{}://{}".format(request.scheme, request.get_host())
return Response(license_data_validated)
logger.warning(smart_text(u"Invalid subscription submitted."),
extra=dict(actor=request.user.username))
logger.warning(smart_text(u"Invalid subscription submitted."), extra=dict(actor=request.user.username))
return Response({"error": _("Invalid subscription")}, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request):

View File

@@ -26,10 +26,7 @@ class WebhookKeyView(GenericAPIView):
permission_classes = (WebhookKeyPermission,)
def get_queryset(self):
qs_models = {
'job_templates': JobTemplate,
'workflow_job_templates': WorkflowJobTemplate,
}
qs_models = {'job_templates': JobTemplate, 'workflow_job_templates': WorkflowJobTemplate}
self.model = qs_models.get(self.kwargs['model_kwarg'])
return super().get_queryset()
@@ -57,10 +54,7 @@ class WebhookReceiverBase(APIView):
ref_keys = {}
def get_queryset(self):
qs_models = {
'job_templates': JobTemplate,
'workflow_job_templates': WorkflowJobTemplate,
}
qs_models = {'job_templates': JobTemplate, 'workflow_job_templates': WorkflowJobTemplate}
model = qs_models.get(self.kwargs['model_kwarg'])
if model is None:
raise PermissionDenied
@@ -120,10 +114,7 @@ class WebhookReceiverBase(APIView):
# Ensure that the full contents of the request are captured for multiple uses.
request.body
logger.debug(
"headers: {}\n"
"data: {}\n".format(request.headers, request.data)
)
logger.debug("headers: {}\n" "data: {}\n".format(request.headers, request.data))
obj = self.get_object()
self.check_signature(obj)
@@ -132,16 +123,11 @@ class WebhookReceiverBase(APIView):
event_ref = self.get_event_ref()
status_api = self.get_event_status_api()
kwargs = {
'unified_job_template_id': obj.id,
'webhook_service': obj.webhook_service,
'webhook_guid': event_guid,
}
kwargs = {'unified_job_template_id': obj.id, 'webhook_service': obj.webhook_service, 'webhook_guid': event_guid}
if WorkflowJob.objects.filter(**kwargs).exists() or Job.objects.filter(**kwargs).exists():
# Short circuit if this webhook has already been received and acted upon.
logger.debug("Webhook previously received, returning without action.")
return Response({'message': _("Webhook previously received, aborting.")},
status=status.HTTP_202_ACCEPTED)
return Response({'message': _("Webhook previously received, aborting.")}, status=status.HTTP_202_ACCEPTED)
kwargs = {
'_eager_fields': {
@@ -156,7 +142,7 @@ class WebhookReceiverBase(APIView):
'tower_webhook_event_ref': event_ref,
'tower_webhook_status_api': status_api,
'tower_webhook_payload': request.data,
}
},
}
new_job = obj.create_unified_job(**kwargs)
@@ -205,11 +191,7 @@ class GithubWebhookReceiver(WebhookReceiverBase):
class GitlabWebhookReceiver(WebhookReceiverBase):
service = 'gitlab'
ref_keys = {
'Push Hook': 'checkout_sha',
'Tag Push Hook': 'checkout_sha',
'Merge Request Hook': 'object_attributes.last_commit.id',
}
ref_keys = {'Push Hook': 'checkout_sha', 'Tag Push Hook': 'checkout_sha', 'Merge Request Hook': 'object_attributes.last_commit.id'}
def get_event_type(self):
return self.request.META.get('HTTP_X_GITLAB_EVENT')
@@ -229,8 +211,7 @@ class GitlabWebhookReceiver(WebhookReceiverBase):
return
parsed = urllib.parse.urlparse(repo_url)
return "{}://{}/api/v4/projects/{}/statuses/{}".format(
parsed.scheme, parsed.netloc, project['id'], self.get_event_ref())
return "{}://{}/api/v4/projects/{}/statuses/{}".format(parsed.scheme, parsed.netloc, project['id'], self.get_event_ref())
def get_signature(self):
return force_bytes(self.request.META.get('HTTP_X_GITLAB_TOKEN') or '')

View File

@@ -4,11 +4,12 @@ import os
import logging
import django
from awx import __version__ as tower_version
# Prepare the AWX environment.
from awx import prepare_env, MODE
from channels.routing import get_default_application # noqa
prepare_env() # NOQA
prepare_env() # NOQA
"""
@@ -29,8 +30,8 @@ if MODE == 'production':
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.") from e
logger.error("Missing or incorrect metadata for controller version. Ensure controller was installed using the setup playbook.")
raise Exception("Missing or incorrect metadata for controller version. Ensure controller was installed using the setup playbook.") from e
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "awx.settings")

View File

@@ -4,7 +4,7 @@
# Django
from django.utils.module_loading import autodiscover_modules
# Tower
# AWX
from .registry import settings_registry
default_app_config = 'awx.conf.apps.ConfConfig'

View File

@@ -4,18 +4,18 @@
# Django
from django.db.models import Q
# Tower
# AWX
from awx.main.access import BaseAccess, register_access
from awx.conf.models import Setting
class SettingAccess(BaseAccess):
'''
"""
- I can see settings when I am a super user or system auditor.
- I can edit settings when I am a super user.
- I can clear settings when I am a super user.
- I can always see/edit/clear my own user settings.
'''
"""
model = Setting

View File

@@ -1,5 +1,6 @@
# Django
from django.apps import AppConfig
# from django.core import checks
from django.utils.translation import ugettext_lazy as _
@@ -12,4 +13,5 @@ class ConfConfig(AppConfig):
def ready(self):
self.module.autodiscover()
from .settings import SettingsWrapper
SettingsWrapper.initialize()

View File

@@ -2,7 +2,7 @@
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
# Tower
# AWX
from awx.conf import fields, register
from awx.conf import settings_registry

View File

@@ -10,10 +10,8 @@ from django.core.validators import URLValidator, _lazy_re_compile
from django.utils.translation import ugettext_lazy as _
# Django REST Framework
from rest_framework.fields import ( # noqa
BooleanField, CharField, ChoiceField, DictField, DateTimeField, EmailField,
IntegerField, ListField, NullBooleanField
)
from rest_framework.fields import BooleanField, CharField, ChoiceField, DictField, DateTimeField, EmailField, IntegerField, ListField, NullBooleanField # noqa
from rest_framework.serializers import PrimaryKeyRelatedField # noqa
logger = logging.getLogger('awx.conf.fields')
@@ -26,7 +24,6 @@ logger = logging.getLogger('awx.conf.fields')
class CharField(CharField):
def to_representation(self, value):
# django_rest_frameworks' default CharField implementation casts `None`
# to a string `"None"`:
@@ -38,7 +35,6 @@ class CharField(CharField):
class IntegerField(IntegerField):
def get_value(self, dictionary):
ret = super(IntegerField, self).get_value(dictionary)
# Handle UI corner case
@@ -59,9 +55,7 @@ class StringListField(ListField):
class StringListBooleanField(ListField):
default_error_messages = {
'type_error': _('Expected None, True, False, a string or list of strings but got {input_type} instead.'),
}
default_error_messages = {'type_error': _('Expected None, True, False, a string or list of strings but got {input_type} instead.')}
child = CharField()
def to_representation(self, value):
@@ -100,10 +94,7 @@ class StringListBooleanField(ListField):
class StringListPathField(StringListField):
default_error_messages = {
'type_error': _('Expected list of strings but got {input_type} instead.'),
'path_error': _('{path} is not a valid path choice.'),
}
default_error_messages = {'type_error': _('Expected list of strings but got {input_type} instead.'), 'path_error': _('{path} is not a valid path choice.')}
def to_internal_value(self, paths):
if isinstance(paths, (list, tuple)):
@@ -122,12 +113,12 @@ class URLField(CharField):
# these lines set up a custom regex that allow numbers in the
# top-level domain
tld_re = (
r'\.' # dot
r'(?!-)' # can't start with a dash
r'(?:[a-z' + URLValidator.ul + r'0-9' + '-]{2,63}' # domain label, this line was changed from the original URLValidator
r'|xn--[a-z0-9]{1,59})' # or punycode label
r'(?<!-)' # can't end with a dash
r'\.?' # may have a trailing dot
r'\.' # dot
r'(?!-)' # can't start with a dash
r'(?:[a-z' + URLValidator.ul + r'0-9' + '-]{2,63}' # domain label, this line was changed from the original URLValidator
r'|xn--[a-z0-9]{1,59})' # or punycode label
r'(?<!-)' # can't end with a dash
r'\.?' # may have a trailing dot
)
host_re = '(' + URLValidator.hostname_re + URLValidator.domain_re + tld_re + '|localhost)'
@@ -138,7 +129,9 @@ class URLField(CharField):
r'(?:' + URLValidator.ipv4_re + '|' + URLValidator.ipv6_re + '|' + host_re + ')'
r'(?::\d{2,5})?' # port
r'(?:[/?#][^\s]*)?' # resource path
r'\Z', re.IGNORECASE)
r'\Z',
re.IGNORECASE,
)
def __init__(self, **kwargs):
schemes = kwargs.pop('schemes', None)
@@ -183,9 +176,7 @@ class URLField(CharField):
class KeyValueField(DictField):
child = CharField()
default_error_messages = {
'invalid_child': _('"{input}" is not a valid string.')
}
default_error_messages = {'invalid_child': _('"{input}" is not a valid string.')}
def to_internal_value(self, data):
ret = super(KeyValueField, self).to_internal_value(data)
@@ -198,9 +189,7 @@ class KeyValueField(DictField):
class ListTuplesField(ListField):
default_error_messages = {
'type_error': _('Expected a list of tuples of max length 2 but got {input_type} instead.'),
}
default_error_messages = {'type_error': _('Expected a list of tuples of max length 2 but got {input_type} instead.')}
def to_representation(self, value):
if isinstance(value, (list, tuple)):

View File

@@ -6,9 +6,10 @@ __all__ = ['get_license']
def _get_validated_license_data():
from awx.main.utils import get_licenser
return get_licenser().validate()
def get_license():
"""Return a dictionary representing the active license on this Tower instance."""
"""Return a dictionary representing the active license on this instance."""
return _get_validated_license_data()

View File

@@ -8,9 +8,7 @@ from django.conf import settings
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
dependencies = [migrations.swappable_dependency(settings.AUTH_USER_MODEL)]
operations = [
migrations.CreateModel(
@@ -21,11 +19,11 @@ class Migration(migrations.Migration):
('modified', models.DateTimeField(default=None, editable=False)),
('key', models.CharField(max_length=255)),
('value', jsonfield.fields.JSONField(null=True)),
('user', models.ForeignKey(related_name='settings', default=None, editable=False,
to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)),
(
'user',
models.ForeignKey(related_name='settings', default=None, editable=False, to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True),
),
],
options={
'abstract': False,
},
),
options={'abstract': False},
)
]

View File

@@ -15,11 +15,7 @@ def copy_tower_settings(apps, schema_editor):
if tower_setting.key == 'LICENSE':
value = json.loads(value)
setting, created = Setting.objects.get_or_create(
key=tower_setting.key,
user=tower_setting.user,
created=tower_setting.created,
modified=tower_setting.modified,
defaults=dict(value=value),
key=tower_setting.key, user=tower_setting.user, created=tower_setting.created, modified=tower_setting.modified, defaults=dict(value=value)
)
if not created and setting.value != value:
setting.value = value
@@ -36,18 +32,9 @@ def revert_tower_settings(apps, schema_editor):
# LICENSE is stored as a JSON object; convert it back to a string.
if setting.key == 'LICENSE':
value = json.dumps(value)
defaults = dict(
value=value,
value_type='string',
description='',
category='',
)
defaults = dict(value=value, value_type='string', description='', category='')
try:
tower_setting, created = TowerSettings.objects.get_or_create(
key=setting.key,
user=setting.user,
defaults=defaults,
)
tower_setting, created = TowerSettings.objects.get_or_create(key=setting.key, user=setting.user, defaults=defaults)
if not created:
update_fields = []
for k, v in defaults.items():
@@ -62,15 +49,8 @@ def revert_tower_settings(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('conf', '0001_initial'),
('main', '0004_squashed_v310_release'),
]
dependencies = [('conf', '0001_initial'), ('main', '0004_squashed_v310_release')]
run_before = [
('main', '0005_squashed_v310_v313_updates'),
]
run_before = [('main', '0005_squashed_v310_v313_updates')]
operations = [
migrations.RunPython(copy_tower_settings, revert_tower_settings),
]
operations = [migrations.RunPython(copy_tower_settings, revert_tower_settings)]

View File

@@ -7,14 +7,6 @@ import awx.main.fields
class Migration(migrations.Migration):
dependencies = [
('conf', '0002_v310_copy_tower_settings'),
]
dependencies = [('conf', '0002_v310_copy_tower_settings')]
operations = [
migrations.AlterField(
model_name='setting',
name='value',
field=awx.main.fields.JSONField(null=True),
),
]
operations = [migrations.AlterField(model_name='setting', name='value', field=awx.main.fields.JSONField(null=True))]

View File

@@ -6,9 +6,7 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('conf', '0003_v310_JSONField_changes'),
]
dependencies = [('conf', '0003_v310_JSONField_changes')]
operations = [
# This list is intentionally empty.

View File

@@ -2,8 +2,8 @@
from __future__ import unicode_literals
from django.db import migrations
from awx.conf.migrations import _rename_setting
def copy_session_settings(apps, schema_editor):
_rename_setting.rename_setting(apps, schema_editor, old_key='AUTH_TOKEN_PER_USER', new_key='SESSIONS_PER_USER')
_rename_setting.rename_setting(apps, schema_editor, old_key='AUTH_TOKEN_EXPIRATION', new_key='SESSION_COOKIE_AGE')
@@ -16,11 +16,6 @@ def reverse_copy_session_settings(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('conf', '0004_v320_reencrypt'),
]
dependencies = [('conf', '0004_v320_reencrypt')]
operations = [
migrations.RunPython(copy_session_settings, reverse_copy_session_settings),
]
operations = [migrations.RunPython(copy_session_settings, reverse_copy_session_settings)]

View File

@@ -9,10 +9,6 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('conf', '0005_v330_rename_two_session_settings'),
]
dependencies = [('conf', '0005_v330_rename_two_session_settings')]
operations = [
migrations.RunPython(fill_ldap_group_type_params),
]
operations = [migrations.RunPython(fill_ldap_group_type_params)]

View File

@@ -10,10 +10,6 @@ def copy_allowed_ips(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('conf', '0006_v331_ldap_group_type'),
]
dependencies = [('conf', '0006_v331_ldap_group_type')]
operations = [
migrations.RunPython(copy_allowed_ips),
]
operations = [migrations.RunPython(copy_allowed_ips)]

View File

@@ -15,12 +15,6 @@ def _noop(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('conf', '0007_v380_rename_more_settings'),
]
dependencies = [('conf', '0007_v380_rename_more_settings')]
operations = [
migrations.RunPython(clear_old_license, _noop),
migrations.RunPython(prefill_rh_credentials, _noop)
]
operations = [migrations.RunPython(clear_old_license, _noop), migrations.RunPython(prefill_rh_credentials, _noop)]

View File

@@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
from awx.conf.migrations import _rename_setting
def rename_proot_settings(apps, schema_editor):
_rename_setting.rename_setting(apps, schema_editor, old_key='AWX_PROOT_BASE_PATH', new_key='AWX_ISOLATION_BASE_PATH')
_rename_setting.rename_setting(apps, schema_editor, old_key='AWX_PROOT_SHOW_PATHS', new_key='AWX_ISOLATION_SHOW_PATHS')
class Migration(migrations.Migration):
dependencies = [('conf', '0008_subscriptions')]
operations = [migrations.RunPython(rename_proot_settings)]

View File

@@ -1,4 +1,3 @@
import inspect
from django.conf import settings
@@ -16,10 +15,7 @@ def fill_ldap_group_type_params(apps, schema_editor):
entry = qs[0]
group_type_params = entry.value
else:
entry = Setting(key='AUTH_LDAP_GROUP_TYPE_PARAMS',
value=group_type_params,
created=now(),
modified=now())
entry = Setting(key='AUTH_LDAP_GROUP_TYPE_PARAMS', value=group_type_params, created=now(), modified=now())
init_attrs = set(inspect.getargspec(group_type.__init__).args[1:])
for k in list(group_type_params.keys()):

View File

@@ -11,15 +11,16 @@ __all__ = ['get_encryption_key', 'decrypt_field']
def get_encryption_key(field_name, pk=None):
'''
"""
Generate key for encrypted password based on field name,
``settings.SECRET_KEY``, and instance pk (if available).
:param pk: (optional) the primary key of the ``awx.conf.model.Setting``;
can be omitted in situations where you're encrypting a setting
that is not database-persistent (like a read-only setting)
'''
"""
from django.conf import settings
h = hashlib.sha1()
h.update(settings.SECRET_KEY)
if pk is not None:
@@ -29,11 +30,11 @@ def get_encryption_key(field_name, pk=None):
def decrypt_value(encryption_key, value):
raw_data = value[len('$encrypted$'):]
raw_data = value[len('$encrypted$') :]
# If the encrypted string contains a UTF8 marker, discard it
utf8 = raw_data.startswith('UTF8$')
if utf8:
raw_data = raw_data[len('UTF8$'):]
raw_data = raw_data[len('UTF8$') :]
algo, b64data = raw_data.split('$', 1)
if algo != 'AES':
raise ValueError('unsupported algorithm: %s' % algo)
@@ -48,9 +49,9 @@ def decrypt_value(encryption_key, value):
def decrypt_field(instance, field_name, subfield=None):
'''
"""
Return content of the given instance and field name decrypted.
'''
"""
value = getattr(instance, field_name)
if isinstance(value, dict) and subfield is not None:
value = value[subfield]

View File

@@ -6,11 +6,11 @@ from django.conf import settings
logger = logging.getLogger('awx.conf.settings')
__all__ = ['rename_setting']
__all__ = ['rename_setting']
def rename_setting(apps, schema_editor, old_key, new_key):
old_setting = None
Setting = apps.get_model('conf', 'Setting')
if Setting.objects.filter(key=new_key).exists() or hasattr(settings, new_key):
@@ -24,9 +24,4 @@ def rename_setting(apps, schema_editor, old_key, new_key):
if hasattr(settings, old_key):
old_setting = getattr(settings, old_key)
if old_setting is not None:
Setting.objects.create(key=new_key,
value=old_setting,
created=now(),
modified=now()
)
Setting.objects.create(key=new_key, value=old_setting, created=now(), modified=now())

View File

@@ -6,7 +6,7 @@ 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')
@@ -17,10 +17,7 @@ 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()
)
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')

View File

@@ -7,7 +7,7 @@ import json
# Django
from django.db import models
# Tower
# AWX
from awx.main.models.base import CreatedModifiedModel, prevent_search
from awx.main.fields import JSONField
from awx.main.utils import encrypt_field
@@ -18,20 +18,9 @@ __all__ = ['Setting']
class Setting(CreatedModifiedModel):
key = models.CharField(
max_length=255,
)
value = JSONField(
null=True,
)
user = prevent_search(models.ForeignKey(
'auth.User',
related_name='settings',
default=None,
null=True,
editable=False,
on_delete=models.CASCADE,
))
key = models.CharField(max_length=255)
value = JSONField(null=True)
user = prevent_search(models.ForeignKey('auth.User', related_name='settings', default=None, null=True, editable=False, on_delete=models.CASCADE))
def __str__(self):
try:
@@ -66,6 +55,7 @@ class Setting(CreatedModifiedModel):
# field and save again.
if encrypted and new_instance:
from awx.main.signals import disable_activity_stream
with disable_activity_stream():
self.value = self._saved_value
self.save(update_fields=['value'])
@@ -82,6 +72,7 @@ class Setting(CreatedModifiedModel):
import awx.conf.signals # noqa
from awx.main.registrar import activity_stream_registrar # noqa
activity_stream_registrar.connect(Setting)
import awx.conf.access # noqa

View File

@@ -69,10 +69,7 @@ class SettingsRegistry(object):
return self._dependent_settings.get(setting, set())
def get_registered_categories(self):
categories = {
'all': _('All'),
'changed': _('Changed'),
}
categories = {'all': _('All'), 'changed': _('Changed')}
for setting, kwargs in self._registry.items():
category_slug = kwargs.get('category_slug', None)
if category_slug is None or category_slug in categories:
@@ -95,8 +92,7 @@ class SettingsRegistry(object):
continue
if kwargs.get('category_slug', None) in slugs_to_ignore:
continue
if (read_only in {True, False} and kwargs.get('read_only', False) != read_only and
setting not in ('INSTALL_UUID', 'AWX_ISOLATED_PRIVATE_KEY', 'AWX_ISOLATED_PUBLIC_KEY')):
if read_only in {True, False} and kwargs.get('read_only', False) != read_only and setting != 'INSTALL_UUID':
# Note: Doesn't catch fields that set read_only via __init__;
# read-only field kwargs should always include read_only=True.
continue
@@ -117,6 +113,7 @@ class SettingsRegistry(object):
def get_setting_field(self, setting, mixin_class=None, for_user=False, **kwargs):
from rest_framework.fields import empty
field_kwargs = {}
field_kwargs.update(self._registry[setting])
field_kwargs.update(kwargs)
@@ -141,11 +138,7 @@ class SettingsRegistry(object):
field_instance.placeholder = placeholder
field_instance.defined_in_file = defined_in_file
if field_instance.defined_in_file:
field_instance.help_text = (
str(_('This value has been set manually in a settings file.')) +
'\n\n' +
str(field_instance.help_text)
)
field_instance.help_text = str(_('This value has been set manually in a settings file.')) + '\n\n' + str(field_instance.help_text)
field_instance.encrypted = encrypted
original_field_instance = field_instance
if field_class != original_field_class:

View File

@@ -1,7 +1,7 @@
# Django REST Framework
from rest_framework import serializers
# Tower
# AWX
from awx.api.fields import VerbatimField
from awx.api.serializers import BaseSerializer
from awx.conf.models import Setting
@@ -28,17 +28,11 @@ class SettingSerializer(BaseSerializer):
class SettingCategorySerializer(serializers.Serializer):
"""Serialize setting category """
"""Serialize setting category"""
url = serializers.CharField(
read_only=True,
)
slug = serializers.CharField(
read_only=True,
)
name = serializers.CharField(
read_only=True,
)
url = serializers.CharField(read_only=True)
slug = serializers.CharField(read_only=True)
name = serializers.CharField(read_only=True)
class SettingFieldMixin(object):
@@ -87,10 +81,8 @@ class SettingSingletonSerializer(serializers.Serializer):
if self.instance and not hasattr(self.instance, key):
continue
extra_kwargs = {}
# Make LICENSE and AWX_ISOLATED_KEY_GENERATION read-only here;
# LICENSE is only updated via /api/v2/config/
# AWX_ISOLATED_KEY_GENERATION is only set/unset via the setup playbook
if key in ('LICENSE', 'AWX_ISOLATED_KEY_GENERATION'):
# Make LICENSE read-only here; LICENSE is only updated via /api/v2/config/
if key == 'LICENSE':
extra_kwargs['read_only'] = True
field = settings_registry.get_setting_field(key, mixin_class=SettingFieldMixin, for_user=bool(category_slug == 'user'), **extra_kwargs)
fields[key] = field

View File

@@ -4,6 +4,7 @@ import logging
import sys
import threading
import time
import os
# Django
from django.conf import LazySettings
@@ -19,7 +20,7 @@ from rest_framework.fields import empty, SkipField
import cachetools
# Tower
# AWX
from awx.main.utils import encrypt_field, decrypt_field
from awx.conf import settings_registry
from awx.conf.models import Setting
@@ -61,12 +62,12 @@ __all__ = ['SettingsWrapper', 'get_settings_to_cache', 'SETTING_CACHE_NOTSET']
@contextlib.contextmanager
def _ctit_db_wrapper(trans_safe=False):
'''
"""
Wrapper to avoid undesired actions by Django ORM when managing settings
if only getting a setting, can use trans_safe=True, which will avoid
throwing errors if the prior context was a broken transaction.
Any database errors will be logged, but exception will be suppressed.
'''
"""
rollback_set = None
is_atomic = None
try:
@@ -114,7 +115,6 @@ class TransientSetting(object):
class EncryptedCacheProxy(object):
def __init__(self, cache, registry, encrypter=None, decrypter=None):
"""
This proxy wraps a Django cache backend and overwrites the
@@ -144,19 +144,11 @@ class EncryptedCacheProxy(object):
def set(self, key, value, log=True, **kwargs):
if log is True:
logger.debug('cache set(%r, %r, %r)', key, filter_sensitive(self.registry, key, value),
SETTING_CACHE_TIMEOUT)
self.cache.set(
key,
self._handle_encryption(self.encrypter, key, value),
**kwargs
)
logger.debug('cache set(%r, %r, %r)', key, filter_sensitive(self.registry, key, value), SETTING_CACHE_TIMEOUT)
self.cache.set(key, self._handle_encryption(self.encrypter, key, value), **kwargs)
def set_many(self, data, **kwargs):
filtered_data = dict(
(key, filter_sensitive(self.registry, key, value))
for key, value in data.items()
)
filtered_data = dict((key, filter_sensitive(self.registry, key, value)) for key, value in data.items())
logger.debug('cache set_many(%r, %r)', filtered_data, SETTING_CACHE_TIMEOUT)
for key, value in data.items():
self.set(key, value, log=False, **kwargs)
@@ -167,18 +159,11 @@ class EncryptedCacheProxy(object):
# as part of the AES key when encrypting/decrypting
obj_id = self.cache.get(Setting.get_cache_id_key(key), default=empty)
if obj_id is empty:
logger.info('Efficiency notice: Corresponding id not stored in cache %s',
Setting.get_cache_id_key(key))
logger.info('Efficiency notice: Corresponding id not stored in cache %s', Setting.get_cache_id_key(key))
obj_id = getattr(self._get_setting_from_db(key), 'pk', None)
elif obj_id == SETTING_CACHE_NONE:
obj_id = None
return method(
TransientSetting(
pk=obj_id,
value=value
),
'value'
)
return method(TransientSetting(pk=obj_id, value=value), 'value')
# If the field in question isn't an "encrypted" field, this function is
# a no-op; it just returns the provided value
@@ -205,9 +190,9 @@ def get_settings_to_cache(registry):
def get_cache_value(value):
'''Returns the proper special cache setting for a value
"""Returns the proper special cache setting for a value
based on instance type.
'''
"""
if value is None:
value = SETTING_CACHE_NONE
elif isinstance(value, (list, tuple)) and len(value) == 0:
@@ -218,7 +203,6 @@ def get_cache_value(value):
class SettingsWrapper(UserSettingsHolder):
@classmethod
def initialize(cls, cache=None, registry=None):
"""
@@ -230,11 +214,7 @@ class SettingsWrapper(UserSettingsHolder):
``awx.conf.settings_registry`` is used by default.
"""
if not getattr(settings, '_awx_conf_settings', False):
settings_wrapper = cls(
settings._wrapped,
cache=cache or django_cache,
registry=registry or settings_registry
)
settings_wrapper = cls(settings._wrapped, cache=cache or django_cache, registry=registry or settings_registry)
settings._wrapped = settings_wrapper
def __init__(self, default_settings, cache, registry):
@@ -247,6 +227,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 +236,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()
@@ -300,7 +301,7 @@ class SettingsWrapper(UserSettingsHolder):
try:
value = decrypt_field(setting, 'value')
except ValueError as e:
#TODO: Remove in Tower 3.3
# TODO: Remove in Tower 3.3
logger.debug('encountered error decrypting field: %s - attempting fallback to old', e)
value = old_decrypt_field(setting, 'value')
@@ -323,8 +324,7 @@ class SettingsWrapper(UserSettingsHolder):
# Generate a cache key for each setting and store them all at once.
settings_to_cache = dict([(Setting.get_cache_key(k), v) for k, v in settings_to_cache.items()])
for k, id_val in setting_ids.items():
logger.debug('Saving id in cache for encrypted setting %s, %s',
Setting.get_cache_id_key(k), id_val)
logger.debug('Saving id in cache for encrypted setting %s, %s', Setting.get_cache_id_key(k), id_val)
self.cache.cache.set(Setting.get_cache_id_key(k), id_val)
settings_to_cache['_awx_conf_preload_expires'] = self._awx_conf_preload_expires
self.cache.set_many(settings_to_cache, timeout=SETTING_CACHE_TIMEOUT)
@@ -350,13 +350,8 @@ class SettingsWrapper(UserSettingsHolder):
if value is empty:
setting = None
setting_id = None
if not field.read_only or name in (
# these values are read-only - however - we *do* want
# to fetch their value from the database
'INSTALL_UUID',
'AWX_ISOLATED_PRIVATE_KEY',
'AWX_ISOLATED_PUBLIC_KEY',
):
# this value is read-only, however we *do* want to fetch its value from the database
if not field.read_only or name == 'INSTALL_UUID':
setting = Setting.objects.filter(key=name, user__isnull=True).order_by('pk').first()
if setting:
if getattr(field, 'encrypted', False):
@@ -398,9 +393,7 @@ class SettingsWrapper(UserSettingsHolder):
else:
return value
except Exception:
logger.warning(
'The current value "%r" for setting "%s" is invalid.',
value, name, exc_info=True)
logger.warning('The current value "%r" for setting "%s" is invalid.', value, name, exc_info=True)
return empty
def _get_default(self, name):
@@ -431,8 +424,7 @@ class SettingsWrapper(UserSettingsHolder):
setting_value = field.run_validation(data)
db_value = field.to_representation(setting_value)
except Exception as e:
logger.exception('Unable to assign value "%r" to setting "%s".',
value, name, exc_info=True)
logger.exception('Unable to assign value "%r" to setting "%s".', value, name, exc_info=True)
raise e
setting = Setting.objects.filter(key=name, user__isnull=True).order_by('pk').first()
@@ -470,8 +462,7 @@ class SettingsWrapper(UserSettingsHolder):
def __dir__(self):
keys = []
with _ctit_db_wrapper(trans_safe=True):
for setting in Setting.objects.filter(
key__in=self.all_supported_settings, user__isnull=True):
for setting in Setting.objects.filter(key__in=self.all_supported_settings, user__isnull=True):
# Skip returning settings that have been overridden but are
# considered to be "not set".
if setting.value is None and SETTING_CACHE_NOTSET == SETTING_CACHE_NONE:
@@ -489,7 +480,7 @@ class SettingsWrapper(UserSettingsHolder):
with _ctit_db_wrapper(trans_safe=True):
set_locally = Setting.objects.filter(key=setting, user__isnull=True).exists()
set_on_default = getattr(self.default_settings, 'is_overridden', lambda s: False)(setting)
return (set_locally or set_on_default)
return set_locally or set_on_default
def __getattr_without_cache__(self, name):

View File

@@ -3,12 +3,12 @@ import logging
# Django
from django.conf import settings
from django.core.cache import cache
from django.core.signals import setting_changed
from django.db.models.signals import post_save, pre_delete, post_delete
from django.core.cache import cache
from django.dispatch import receiver
# Tower
# AWX
from awx.conf import settings_registry
from awx.conf.models import Setting
@@ -25,17 +25,12 @@ def handle_setting_change(key, for_delete=False):
# Note: Doesn't handle multiple levels of dependencies!
setting_keys.append(dependent_key)
# NOTE: This block is probably duplicated.
cache_keys = set([Setting.get_cache_key(k) for k in setting_keys])
cache_keys = {Setting.get_cache_key(k) for k in setting_keys}
cache.delete_many(cache_keys)
# Send setting_changed signal with new value for each setting.
for setting_key in setting_keys:
setting_changed.send(
sender=Setting,
setting=setting_key,
value=getattr(settings, setting_key, None),
enter=not bool(for_delete),
)
setting_changed.send(sender=Setting, setting=setting_key, value=getattr(settings, setting_key, None), enter=not bool(for_delete))
@receiver(post_save, sender=Setting)
@@ -63,3 +58,18 @@ def on_post_delete_setting(sender, **kwargs):
key = getattr(instance, '_saved_key_', None)
if key:
handle_setting_change(key, True)
@receiver(setting_changed)
def disable_local_auth(**kwargs):
if (kwargs['setting'], kwargs['value']) == ('DISABLE_LOCAL_AUTH', True):
from django.contrib.auth.models import User
from oauth2_provider.models import RefreshToken
from awx.main.models.oauth import OAuth2AccessToken
from awx.main.management.commands.revoke_oauth2_tokens import revoke_tokens
logger.warning("Triggering token invalidation for local users.")
qs = User.objects.filter(profile__ldap_dn='', enterprise_auth__isnull=True, social_auth__isnull=True)
revoke_tokens(RefreshToken.objects.filter(revoked=None, user__in=qs))
revoke_tokens(OAuth2AccessToken.objects.filter(user__in=qs))

View File

@@ -5,10 +5,7 @@ import pytest
from django.urls import resolve
from django.contrib.auth.models import User
from rest_framework.test import (
APIRequestFactory,
force_authenticate,
)
from rest_framework.test import APIRequestFactory, force_authenticate
@pytest.fixture
@@ -41,4 +38,5 @@ def api_request(admin):
response = view(request, *view_args, **view_kwargs)
response.render()
return response
return rf

View File

@@ -45,44 +45,19 @@ def dummy_validate():
@pytest.mark.django_db
def test_non_admin_user_does_not_see_categories(api_request, dummy_setting, normal_user):
with dummy_setting(
'FOO_BAR',
field_class=fields.IntegerField,
category='FooBar',
category_slug='foobar'
):
response = api_request(
'get',
reverse('api:setting_category_list',
kwargs={'version': 'v2'})
)
with dummy_setting('FOO_BAR', field_class=fields.IntegerField, category='FooBar', category_slug='foobar'):
response = api_request('get', reverse('api:setting_category_list', kwargs={'version': 'v2'}))
assert response.data['results']
response = api_request(
'get',
reverse('api:setting_category_list',
kwargs={'version': 'v2'}),
user=normal_user
)
response = api_request('get', reverse('api:setting_category_list', kwargs={'version': 'v2'}), user=normal_user)
assert not response.data['results']
@pytest.mark.django_db
def test_setting_singleton_detail_retrieve(api_request, dummy_setting):
with dummy_setting(
'FOO_BAR_1',
field_class=fields.IntegerField,
category='FooBar',
category_slug='foobar'
), dummy_setting(
'FOO_BAR_2',
field_class=fields.IntegerField,
category='FooBar',
category_slug='foobar'
with dummy_setting('FOO_BAR_1', field_class=fields.IntegerField, category='FooBar', category_slug='foobar'), dummy_setting(
'FOO_BAR_2', field_class=fields.IntegerField, category='FooBar', category_slug='foobar'
):
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert response.status_code == 200
assert 'FOO_BAR_1' in response.data and response.data['FOO_BAR_1'] is None
assert 'FOO_BAR_2' in response.data and response.data['FOO_BAR_2'] is None
@@ -90,97 +65,43 @@ def test_setting_singleton_detail_retrieve(api_request, dummy_setting):
@pytest.mark.django_db
def test_setting_singleton_detail_invalid_retrieve(api_request, dummy_setting, normal_user):
with dummy_setting(
'FOO_BAR_1',
field_class=fields.IntegerField,
category='FooBar',
category_slug='foobar'
), dummy_setting(
'FOO_BAR_2',
field_class=fields.IntegerField,
category='FooBar',
category_slug='foobar'
with dummy_setting('FOO_BAR_1', field_class=fields.IntegerField, category='FooBar', category_slug='foobar'), dummy_setting(
'FOO_BAR_2', field_class=fields.IntegerField, category='FooBar', category_slug='foobar'
):
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'barfoo'})
)
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'barfoo'}))
assert response.status_code == 404
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}),
user = normal_user
)
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}), user=normal_user)
assert response.status_code == 403
@pytest.mark.django_db
def test_setting_signleton_retrieve_hierachy(api_request, dummy_setting):
with dummy_setting(
'FOO_BAR',
field_class=fields.IntegerField,
default=0,
category='FooBar',
category_slug='foobar'
):
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
with dummy_setting('FOO_BAR', field_class=fields.IntegerField, default=0, category='FooBar', category_slug='foobar'):
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert response.data['FOO_BAR'] == 0
s = Setting(key='FOO_BAR', value=1)
s.save()
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert response.data['FOO_BAR'] == 1
@pytest.mark.django_db
def test_setting_singleton_retrieve_readonly(api_request, dummy_setting):
with dummy_setting(
'FOO_BAR',
field_class=fields.IntegerField,
read_only=True,
default=2,
category='FooBar',
category_slug='foobar'
):
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
with dummy_setting('FOO_BAR', field_class=fields.IntegerField, read_only=True, default=2, category='FooBar', category_slug='foobar'):
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert response.data['FOO_BAR'] == 2
@pytest.mark.django_db
def test_setting_singleton_update(api_request, dummy_setting):
with dummy_setting(
'FOO_BAR',
field_class=fields.IntegerField,
category='FooBar',
category_slug='foobar'
), mock.patch('awx.conf.views.handle_setting_changes'):
api_request(
'patch',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}),
data={'FOO_BAR': 3}
)
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
with dummy_setting('FOO_BAR', field_class=fields.IntegerField, category='FooBar', category_slug='foobar'), mock.patch(
'awx.conf.views.handle_setting_changes'
):
api_request('patch', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}), data={'FOO_BAR': 3})
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert response.data['FOO_BAR'] == 3
api_request(
'patch',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}),
data={'FOO_BAR': 4}
)
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
api_request('patch', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}), data={'FOO_BAR': 4})
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert response.data['FOO_BAR'] == 4
@@ -190,138 +111,70 @@ def test_setting_singleton_update_hybriddictfield_with_forbidden(api_request, du
# indicating that only the defined fields can be filled in. Make
# sure that the _Forbidden validator doesn't get used for the
# fields. See also https://github.com/ansible/awx/issues/4099.
with dummy_setting(
'FOO_BAR',
field_class=sso_fields.SAMLOrgAttrField,
category='FooBar',
category_slug='foobar',
), mock.patch('awx.conf.views.handle_setting_changes'):
with dummy_setting('FOO_BAR', field_class=sso_fields.SAMLOrgAttrField, category='FooBar', category_slug='foobar'), mock.patch(
'awx.conf.views.handle_setting_changes'
):
api_request(
'patch',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}),
data={'FOO_BAR': {'saml_admin_attr': 'Admins', 'saml_attr': 'Orgs'}}
)
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
data={'FOO_BAR': {'saml_admin_attr': 'Admins', 'saml_attr': 'Orgs'}},
)
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert response.data['FOO_BAR'] == {'saml_admin_attr': 'Admins', 'saml_attr': 'Orgs'}
@pytest.mark.django_db
def test_setting_singleton_update_dont_change_readonly_fields(api_request, dummy_setting):
with dummy_setting(
'FOO_BAR',
field_class=fields.IntegerField,
read_only=True,
default=4,
category='FooBar',
category_slug='foobar'
), mock.patch('awx.conf.views.handle_setting_changes'):
api_request(
'patch',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}),
data={'FOO_BAR': 5}
)
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
with dummy_setting('FOO_BAR', field_class=fields.IntegerField, read_only=True, default=4, category='FooBar', category_slug='foobar'), mock.patch(
'awx.conf.views.handle_setting_changes'
):
api_request('patch', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}), data={'FOO_BAR': 5})
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert response.data['FOO_BAR'] == 4
@pytest.mark.django_db
def test_setting_singleton_update_dont_change_encrypted_mark(api_request, dummy_setting):
with dummy_setting(
'FOO_BAR',
field_class=fields.CharField,
encrypted=True,
category='FooBar',
category_slug='foobar'
), mock.patch('awx.conf.views.handle_setting_changes'):
api_request(
'patch',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}),
data={'FOO_BAR': 'password'}
)
with dummy_setting('FOO_BAR', field_class=fields.CharField, encrypted=True, category='FooBar', category_slug='foobar'), mock.patch(
'awx.conf.views.handle_setting_changes'
):
api_request('patch', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}), data={'FOO_BAR': 'password'})
assert Setting.objects.get(key='FOO_BAR').value.startswith('$encrypted$')
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert response.data['FOO_BAR'] == '$encrypted$'
api_request(
'patch',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}),
data={'FOO_BAR': '$encrypted$'}
)
api_request('patch', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}), data={'FOO_BAR': '$encrypted$'})
assert decrypt_field(Setting.objects.get(key='FOO_BAR'), 'value') == 'password'
api_request(
'patch',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}),
data={'FOO_BAR': 'new_pw'}
)
api_request('patch', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}), data={'FOO_BAR': 'new_pw'})
assert decrypt_field(Setting.objects.get(key='FOO_BAR'), 'value') == 'new_pw'
@pytest.mark.django_db
def test_setting_singleton_update_runs_custom_validate(api_request, dummy_setting, dummy_validate):
def func_raising_exception(serializer, attrs):
raise serializers.ValidationError('Error')
with dummy_setting(
'FOO_BAR',
field_class=fields.IntegerField,
category='FooBar',
category_slug='foobar'
), dummy_validate(
with dummy_setting('FOO_BAR', field_class=fields.IntegerField, category='FooBar', category_slug='foobar'), dummy_validate(
'foobar', func_raising_exception
), mock.patch('awx.conf.views.handle_setting_changes'):
response = api_request(
'patch',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}),
data={'FOO_BAR': 23}
)
response = api_request('patch', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}), data={'FOO_BAR': 23})
assert response.status_code == 400
@pytest.mark.django_db
def test_setting_singleton_delete(api_request, dummy_setting):
with dummy_setting(
'FOO_BAR',
field_class=fields.IntegerField,
category='FooBar',
category_slug='foobar'
), mock.patch('awx.conf.views.handle_setting_changes'):
api_request(
'delete',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
with dummy_setting('FOO_BAR', field_class=fields.IntegerField, category='FooBar', category_slug='foobar'), mock.patch(
'awx.conf.views.handle_setting_changes'
):
api_request('delete', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert not response.data['FOO_BAR']
@pytest.mark.django_db
def test_setting_singleton_delete_no_read_only_fields(api_request, dummy_setting):
with dummy_setting(
'FOO_BAR',
field_class=fields.IntegerField,
read_only=True,
default=23,
category='FooBar',
category_slug='foobar'
), mock.patch('awx.conf.views.handle_setting_changes'):
api_request(
'delete',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
response = api_request(
'get',
reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'})
)
with dummy_setting('FOO_BAR', field_class=fields.IntegerField, read_only=True, default=23, category='FooBar', category_slug='foobar'), mock.patch(
'awx.conf.views.handle_setting_changes'
):
api_request('delete', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
response = api_request('get', reverse('api:setting_singleton_detail', kwargs={'category_slug': 'foobar'}))
assert response.data['FOO_BAR'] == 23

View File

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

View File

@@ -4,7 +4,7 @@ from rest_framework.fields import ValidationError
from awx.conf.fields import StringListBooleanField, StringListPathField, ListTuplesField, URLField
class TestStringListBooleanField():
class TestStringListBooleanField:
FIELD_VALUES = [
("hello", "hello"),
@@ -23,10 +23,7 @@ class TestStringListBooleanField():
("NULL", None),
]
FIELD_VALUES_INVALID = [
1.245,
{"a": "b"},
]
FIELD_VALUES_INVALID = [1.245, {"a": "b"}]
@pytest.mark.parametrize("value_in, value_known", FIELD_VALUES)
def test_to_internal_value_valid(self, value_in, value_known):
@@ -39,8 +36,7 @@ class TestStringListBooleanField():
field = StringListBooleanField()
with pytest.raises(ValidationError) as e:
field.to_internal_value(value)
assert e.value.detail[0] == "Expected None, True, False, a string or list " \
"of strings but got {} instead.".format(type(value))
assert e.value.detail[0] == "Expected None, True, False, a string or list " "of strings but got {} instead.".format(type(value))
@pytest.mark.parametrize("value_in, value_known", FIELD_VALUES)
def test_to_representation_valid(self, value_in, value_known):
@@ -53,22 +49,14 @@ class TestStringListBooleanField():
field = StringListBooleanField()
with pytest.raises(ValidationError) as e:
field.to_representation(value)
assert e.value.detail[0] == "Expected None, True, False, a string or list " \
"of strings but got {} instead.".format(type(value))
assert e.value.detail[0] == "Expected None, True, False, a string or list " "of strings but got {} instead.".format(type(value))
class TestListTuplesField():
class TestListTuplesField:
FIELD_VALUES = [
([('a', 'b'), ('abc', '123')], [("a", "b"), ("abc", "123")]),
]
FIELD_VALUES = [([('a', 'b'), ('abc', '123')], [("a", "b"), ("abc", "123")])]
FIELD_VALUES_INVALID = [
("abc", type("abc")),
([('a', 'b', 'c'), ('abc', '123', '456')], type(('a',))),
(['a', 'b'], type('a')),
(123, type(123)),
]
FIELD_VALUES_INVALID = [("abc", type("abc")), ([('a', 'b', 'c'), ('abc', '123', '456')], type(('a',))), (['a', 'b'], type('a')), (123, type(123))]
@pytest.mark.parametrize("value_in, value_known", FIELD_VALUES)
def test_to_internal_value_valid(self, value_in, value_known):
@@ -81,11 +69,10 @@ class TestListTuplesField():
field = ListTuplesField()
with pytest.raises(ValidationError) as e:
field.to_internal_value(value)
assert e.value.detail[0] == "Expected a list of tuples of max length 2 " \
"but got {} instead.".format(t)
assert e.value.detail[0] == "Expected a list of tuples of max length 2 " "but got {} instead.".format(t)
class TestStringListPathField():
class TestStringListPathField:
FIELD_VALUES = [
((".", "..", "/"), [".", "..", "/"]),
@@ -93,22 +80,12 @@ class TestStringListPathField():
(("///home///",), ["/home"]),
(("/home/././././",), ["/home"]),
(("/home", "/home", "/home/"), ["/home"]),
(["/home/", "/home/", "/opt/", "/opt/", "/var/"], ["/home", "/opt", "/var"])
(["/home/", "/home/", "/opt/", "/opt/", "/var/"], ["/home", "/opt", "/var"]),
]
FIELD_VALUES_INVALID_TYPE = [
1.245,
{"a": "b"},
("/home"),
]
FIELD_VALUES_INVALID_TYPE = [1.245, {"a": "b"}, ("/home")]
FIELD_VALUES_INVALID_PATH = [
"",
"~/",
"home",
"/invalid_path",
"/home/invalid_path",
]
FIELD_VALUES_INVALID_PATH = ["", "~/", "home", "/invalid_path", "/home/invalid_path"]
@pytest.mark.parametrize("value_in, value_known", FIELD_VALUES)
def test_to_internal_value_valid(self, value_in, value_known):
@@ -131,16 +108,19 @@ class TestStringListPathField():
assert e.value.detail[0] == "{} is not a valid path choice.".format(value)
class TestURLField():
class TestURLField:
regex = "^https://www.example.org$"
@pytest.mark.parametrize("url,schemes,regex, allow_numbers_in_top_level_domain, expect_no_error",[
("ldap://www.example.org42", "ldap", None, True, True),
("https://www.example.org42", "https", None, False, False),
("https://www.example.org", None, regex, None, True),
("https://www.example3.org", None, regex, None, False),
("ftp://www.example.org", "https", None, None, False)
])
@pytest.mark.parametrize(
"url,schemes,regex, allow_numbers_in_top_level_domain, expect_no_error",
[
("ldap://www.example.org42", "ldap", None, True, True),
("https://www.example.org42", "https", None, False, False),
("https://www.example.org", None, regex, None, True),
("https://www.example3.org", None, regex, None, False),
("ftp://www.example.org", "https", None, None, False),
],
)
def test_urls(self, url, schemes, regex, allow_numbers_in_top_level_domain, expect_no_error):
kwargs = {}
kwargs.setdefault("allow_numbers_in_top_level_domain", allow_numbers_in_top_level_domain)

View File

@@ -33,30 +33,18 @@ def reg(request):
if marker.name == 'defined_in_file':
settings.configure(**marker.kwargs)
settings._wrapped = SettingsWrapper(settings._wrapped,
cache,
registry)
settings._wrapped = SettingsWrapper(settings._wrapped, cache, registry)
return registry
def test_simple_setting_registration(reg):
assert reg.get_registered_settings() == []
reg.register(
'AWX_SOME_SETTING_ENABLED',
field_class=fields.BooleanField,
category=_('System'),
category_slug='system',
)
reg.register('AWX_SOME_SETTING_ENABLED', field_class=fields.BooleanField, category=_('System'), category_slug='system')
assert reg.get_registered_settings() == ['AWX_SOME_SETTING_ENABLED']
def test_simple_setting_unregistration(reg):
reg.register(
'AWX_SOME_SETTING_ENABLED',
field_class=fields.BooleanField,
category=_('System'),
category_slug='system',
)
reg.register('AWX_SOME_SETTING_ENABLED', field_class=fields.BooleanField, category=_('System'), category_slug='system')
assert reg.get_registered_settings() == ['AWX_SOME_SETTING_ENABLED']
reg.unregister('AWX_SOME_SETTING_ENABLED')
@@ -67,12 +55,7 @@ def test_duplicate_setting_registration(reg):
"ensure that settings cannot be registered twice."
with pytest.raises(ImproperlyConfigured):
for i in range(2):
reg.register(
'AWX_SOME_SETTING_ENABLED',
field_class=fields.BooleanField,
category=_('System'),
category_slug='system',
)
reg.register('AWX_SOME_SETTING_ENABLED', field_class=fields.BooleanField, category=_('System'), category_slug='system')
def test_field_class_required_for_registration(reg):
@@ -82,110 +65,42 @@ def test_field_class_required_for_registration(reg):
def test_get_registered_settings_by_slug(reg):
reg.register(
'AWX_SOME_SETTING_ENABLED',
field_class=fields.BooleanField,
category=_('System'),
category_slug='system',
)
assert reg.get_registered_settings(category_slug='system') == [
'AWX_SOME_SETTING_ENABLED'
]
reg.register('AWX_SOME_SETTING_ENABLED', field_class=fields.BooleanField, category=_('System'), category_slug='system')
assert reg.get_registered_settings(category_slug='system') == ['AWX_SOME_SETTING_ENABLED']
assert reg.get_registered_settings(category_slug='other') == []
def test_get_registered_read_only_settings(reg):
reg.register(
'AWX_SOME_SETTING_ENABLED',
field_class=fields.BooleanField,
category=_('System'),
category_slug='system'
)
reg.register(
'AWX_SOME_READ_ONLY',
field_class=fields.BooleanField,
category=_('System'),
category_slug='system',
read_only=True
)
assert reg.get_registered_settings(read_only=True) ==[
'AWX_SOME_READ_ONLY'
]
assert reg.get_registered_settings(read_only=False) == [
'AWX_SOME_SETTING_ENABLED'
]
assert reg.get_registered_settings() == [
'AWX_SOME_SETTING_ENABLED',
'AWX_SOME_READ_ONLY'
]
reg.register('AWX_SOME_SETTING_ENABLED', field_class=fields.BooleanField, category=_('System'), category_slug='system')
reg.register('AWX_SOME_READ_ONLY', field_class=fields.BooleanField, category=_('System'), category_slug='system', read_only=True)
assert reg.get_registered_settings(read_only=True) == ['AWX_SOME_READ_ONLY']
assert reg.get_registered_settings(read_only=False) == ['AWX_SOME_SETTING_ENABLED']
assert reg.get_registered_settings() == ['AWX_SOME_SETTING_ENABLED', 'AWX_SOME_READ_ONLY']
def test_get_dependent_settings(reg):
reg.register('AWX_SOME_SETTING_ENABLED', field_class=fields.BooleanField, category=_('System'), category_slug='system')
reg.register(
'AWX_SOME_SETTING_ENABLED',
field_class=fields.BooleanField,
category=_('System'),
category_slug='system'
'AWX_SOME_DEPENDENT_SETTING', field_class=fields.BooleanField, category=_('System'), category_slug='system', depends_on=['AWX_SOME_SETTING_ENABLED']
)
reg.register(
'AWX_SOME_DEPENDENT_SETTING',
field_class=fields.BooleanField,
category=_('System'),
category_slug='system',
depends_on=['AWX_SOME_SETTING_ENABLED']
)
assert reg.get_dependent_settings('AWX_SOME_SETTING_ENABLED') == set([
'AWX_SOME_DEPENDENT_SETTING'
])
assert reg.get_dependent_settings('AWX_SOME_SETTING_ENABLED') == set(['AWX_SOME_DEPENDENT_SETTING'])
def test_get_registered_categories(reg):
reg.register(
'AWX_SOME_SETTING_ENABLED',
field_class=fields.BooleanField,
category=_('System'),
category_slug='system'
)
reg.register(
'AWX_SOME_OTHER_SETTING_ENABLED',
field_class=fields.BooleanField,
category=_('OtherSystem'),
category_slug='other-system'
)
assert reg.get_registered_categories() == {
'all': _('All'),
'changed': _('Changed'),
'system': _('System'),
'other-system': _('OtherSystem'),
}
reg.register('AWX_SOME_SETTING_ENABLED', field_class=fields.BooleanField, category=_('System'), category_slug='system')
reg.register('AWX_SOME_OTHER_SETTING_ENABLED', field_class=fields.BooleanField, category=_('OtherSystem'), category_slug='other-system')
assert reg.get_registered_categories() == {'all': _('All'), 'changed': _('Changed'), 'system': _('System'), 'other-system': _('OtherSystem')}
def test_is_setting_encrypted(reg):
reg.register(
'AWX_SOME_SETTING_ENABLED',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
reg.register(
'AWX_SOME_ENCRYPTED_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
encrypted=True
)
reg.register('AWX_SOME_SETTING_ENABLED', field_class=fields.CharField, category=_('System'), category_slug='system')
reg.register('AWX_SOME_ENCRYPTED_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system', encrypted=True)
assert reg.is_setting_encrypted('AWX_SOME_SETTING_ENABLED') is False
assert reg.is_setting_encrypted('AWX_SOME_ENCRYPTED_SETTING') is True
def test_simple_field(reg):
reg.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
placeholder='Example Value',
)
reg.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system', placeholder='Example Value')
field = reg.get_setting_field('AWX_SOME_SETTING')
assert isinstance(field, fields.CharField)
@@ -196,31 +111,20 @@ def test_simple_field(reg):
def test_field_with_custom_attribute(reg):
reg.register(
'AWX_SOME_SETTING_ENABLED',
field_class=fields.BooleanField,
category_slug='system',
)
reg.register('AWX_SOME_SETTING_ENABLED', field_class=fields.BooleanField, category_slug='system')
field = reg.get_setting_field('AWX_SOME_SETTING_ENABLED',
category_slug='other-system')
field = reg.get_setting_field('AWX_SOME_SETTING_ENABLED', category_slug='other-system')
assert field.category_slug == 'other-system'
def test_field_with_custom_mixin(reg):
class GreatMixin(object):
def is_great(self):
return True
reg.register(
'AWX_SOME_SETTING_ENABLED',
field_class=fields.BooleanField,
category_slug='system',
)
reg.register('AWX_SOME_SETTING_ENABLED', field_class=fields.BooleanField, category_slug='system')
field = reg.get_setting_field('AWX_SOME_SETTING_ENABLED',
mixin_class=GreatMixin)
field = reg.get_setting_field('AWX_SOME_SETTING_ENABLED', mixin_class=GreatMixin)
assert isinstance(field, fields.BooleanField)
assert isinstance(field, GreatMixin)
assert field.is_great() is True
@@ -228,12 +132,7 @@ def test_field_with_custom_mixin(reg):
@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT')
def test_default_value_from_settings(reg):
reg.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
)
reg.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system')
field = reg.get_setting_field('AWX_SOME_SETTING')
assert field.default == 'DEFAULT'
@@ -242,16 +141,10 @@ def test_default_value_from_settings(reg):
@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT')
def test_default_value_from_settings_with_custom_representation(reg):
class LowercaseCharField(fields.CharField):
def to_representation(self, value):
return value.lower()
reg.register(
'AWX_SOME_SETTING',
field_class=LowercaseCharField,
category=_('System'),
category_slug='system',
)
reg.register('AWX_SOME_SETTING', field_class=LowercaseCharField, category=_('System'), category_slug='system')
field = reg.get_setting_field('AWX_SOME_SETTING')
assert field.default == 'default'

View File

@@ -53,9 +53,7 @@ def settings(request):
defaults['DEFAULTS_SNAPSHOT'] = {}
settings.configure(**defaults)
settings._wrapped = SettingsWrapper(settings._wrapped,
cache,
registry)
settings._wrapped = SettingsWrapper(settings._wrapped, cache, registry)
return settings
@@ -67,14 +65,7 @@ def test_unregistered_setting(settings):
def test_read_only_setting(settings):
settings.registry.register(
'AWX_READ_ONLY',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
default='NO-EDITS',
read_only=True
)
settings.registry.register('AWX_READ_ONLY', field_class=fields.CharField, category=_('System'), category_slug='system', default='NO-EDITS', read_only=True)
assert settings.AWX_READ_ONLY == 'NO-EDITS'
assert len(settings.registry.get_registered_settings(read_only=False)) == 0
settings = settings.registry.get_registered_settings(read_only=True)
@@ -85,13 +76,7 @@ def test_read_only_setting(settings):
@pytest.mark.parametrize('read_only', [True, False])
def test_setting_defined_in_file(settings, read_only):
kwargs = {'read_only': True} if read_only else {}
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
**kwargs
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system', **kwargs)
assert settings.AWX_SOME_SETTING == 'DEFAULT'
assert len(settings.registry.get_registered_settings(read_only=False)) == 0
settings = settings.registry.get_registered_settings(read_only=True)
@@ -100,13 +85,7 @@ def test_setting_defined_in_file(settings, read_only):
@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT')
def test_setting_defined_in_file_with_empty_default(settings):
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
default='',
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system', default='')
assert settings.AWX_SOME_SETTING == 'DEFAULT'
assert len(settings.registry.get_registered_settings(read_only=False)) == 0
settings = settings.registry.get_registered_settings(read_only=True)
@@ -115,13 +94,7 @@ def test_setting_defined_in_file_with_empty_default(settings):
@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT')
def test_setting_defined_in_file_with_specific_default(settings):
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
default=123
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system', default=123)
assert settings.AWX_SOME_SETTING == 'DEFAULT'
assert len(settings.registry.get_registered_settings(read_only=False)) == 0
settings = settings.registry.get_registered_settings(read_only=True)
@@ -131,12 +104,7 @@ def test_setting_defined_in_file_with_specific_default(settings):
@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT')
def test_read_only_defaults_are_cached(settings):
"read-only settings are stored in the cache"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system')
assert settings.AWX_SOME_SETTING == 'DEFAULT'
assert settings.cache.get('AWX_SOME_SETTING') == 'DEFAULT'
@@ -144,12 +112,7 @@ def test_read_only_defaults_are_cached(settings):
@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT')
def test_cache_respects_timeout(settings):
"only preload the cache every SETTING_CACHE_TIMEOUT settings"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system')
assert settings.AWX_SOME_SETTING == 'DEFAULT'
cache_expiration = settings.cache.get('_awx_conf_preload_expires')
@@ -161,13 +124,7 @@ def test_cache_respects_timeout(settings):
def test_default_setting(settings, mocker):
"settings that specify a default are inserted into the cache"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
default='DEFAULT'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system', default='DEFAULT')
settings_to_cache = mocker.Mock(**{'order_by.return_value': []})
with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=settings_to_cache):
@@ -177,24 +134,13 @@ def test_default_setting(settings, mocker):
@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT')
def test_setting_is_from_setting_file(settings, mocker):
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system')
assert settings.AWX_SOME_SETTING == 'DEFAULT'
assert settings.registry.get_setting_field('AWX_SOME_SETTING').defined_in_file is True
def test_setting_is_not_from_setting_file(settings, mocker):
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
default='DEFAULT'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system', default='DEFAULT')
settings_to_cache = mocker.Mock(**{'order_by.return_value': []})
with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=settings_to_cache):
@@ -204,19 +150,9 @@ def test_setting_is_not_from_setting_file(settings, mocker):
def test_empty_setting(settings, mocker):
"settings with no default and no defined value are not valid"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system')
mocks = mocker.Mock(**{
'order_by.return_value': mocker.Mock(**{
'__iter__': lambda self: iter([]),
'first.return_value': None
}),
})
mocks = mocker.Mock(**{'order_by.return_value': mocker.Mock(**{'__iter__': lambda self: iter([]), 'first.return_value': None})})
with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=mocks):
with pytest.raises(AttributeError):
settings.AWX_SOME_SETTING
@@ -225,21 +161,10 @@ def test_empty_setting(settings, mocker):
def test_setting_from_db(settings, mocker):
"settings can be loaded from the database"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
default='DEFAULT'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system', default='DEFAULT')
setting_from_db = mocker.Mock(key='AWX_SOME_SETTING', value='FROM_DB')
mocks = mocker.Mock(**{
'order_by.return_value': mocker.Mock(**{
'__iter__': lambda self: iter([setting_from_db]),
'first.return_value': setting_from_db
}),
})
mocks = mocker.Mock(**{'order_by.return_value': mocker.Mock(**{'__iter__': lambda self: iter([setting_from_db]), 'first.return_value': setting_from_db})})
with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=mocks):
assert settings.AWX_SOME_SETTING == 'FROM_DB'
assert settings.cache.get('AWX_SOME_SETTING') == 'FROM_DB'
@@ -248,12 +173,7 @@ def test_setting_from_db(settings, mocker):
@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT')
def test_read_only_setting_assignment(settings):
"read-only settings cannot be overwritten"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system')
assert settings.AWX_SOME_SETTING == 'DEFAULT'
with pytest.raises(ImproperlyConfigured):
settings.AWX_SOME_SETTING = 'CHANGED'
@@ -262,41 +182,26 @@ def test_read_only_setting_assignment(settings):
def test_db_setting_create(settings, mocker):
"settings are stored in the database when set for the first time"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system')
setting_list = mocker.Mock(**{'order_by.return_value.first.return_value': None})
with apply_patches([
mocker.patch('awx.conf.models.Setting.objects.filter',
return_value=setting_list),
mocker.patch('awx.conf.models.Setting.objects.create', mocker.Mock())
]):
with apply_patches(
[
mocker.patch('awx.conf.models.Setting.objects.filter', return_value=setting_list),
mocker.patch('awx.conf.models.Setting.objects.create', mocker.Mock()),
]
):
settings.AWX_SOME_SETTING = 'NEW-VALUE'
models.Setting.objects.create.assert_called_with(
key='AWX_SOME_SETTING',
user=None,
value='NEW-VALUE'
)
models.Setting.objects.create.assert_called_with(key='AWX_SOME_SETTING', user=None, value='NEW-VALUE')
def test_db_setting_update(settings, mocker):
"settings are updated in the database when their value changes"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system')
existing_setting = mocker.Mock(key='AWX_SOME_SETTING', value='FROM_DB')
setting_list = mocker.Mock(**{
'order_by.return_value.first.return_value': existing_setting
})
setting_list = mocker.Mock(**{'order_by.return_value.first.return_value': existing_setting})
with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=setting_list):
settings.AWX_SOME_SETTING = 'NEW-VALUE'
@@ -306,12 +211,7 @@ def test_db_setting_update(settings, mocker):
def test_db_setting_deletion(settings, mocker):
"settings are auto-deleted from the database"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system')
existing_setting = mocker.Mock(key='AWX_SOME_SETTING', value='FROM_DB')
with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=[existing_setting]):
@@ -323,12 +223,7 @@ def test_db_setting_deletion(settings, mocker):
@pytest.mark.defined_in_file(AWX_SOME_SETTING='DEFAULT')
def test_read_only_setting_deletion(settings):
"read-only settings cannot be deleted"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system')
assert settings.AWX_SOME_SETTING == 'DEFAULT'
with pytest.raises(ImproperlyConfigured):
del settings.AWX_SOME_SETTING
@@ -337,36 +232,22 @@ def test_read_only_setting_deletion(settings):
def test_charfield_properly_sets_none(settings, mocker):
"see: https://github.com/ansible/ansible-tower/issues/5322"
settings.registry.register(
'AWX_SOME_SETTING',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
allow_null=True
)
settings.registry.register('AWX_SOME_SETTING', field_class=fields.CharField, category=_('System'), category_slug='system', allow_null=True)
setting_list = mocker.Mock(**{'order_by.return_value.first.return_value': None})
with apply_patches([
mocker.patch('awx.conf.models.Setting.objects.filter',
return_value=setting_list),
mocker.patch('awx.conf.models.Setting.objects.create', mocker.Mock())
]):
with apply_patches(
[
mocker.patch('awx.conf.models.Setting.objects.filter', return_value=setting_list),
mocker.patch('awx.conf.models.Setting.objects.create', mocker.Mock()),
]
):
settings.AWX_SOME_SETTING = None
models.Setting.objects.create.assert_called_with(
key='AWX_SOME_SETTING',
user=None,
value=None
)
models.Setting.objects.create.assert_called_with(key='AWX_SOME_SETTING', user=None, value=None)
def test_settings_use_cache(settings, mocker):
settings.registry.register(
'AWX_VAR',
field_class=fields.CharField,
category=_('System'),
category_slug='system'
)
settings.registry.register('AWX_VAR', field_class=fields.CharField, category=_('System'), category_slug='system')
settings.cache.set('AWX_VAR', 'foobar')
settings.cache.set('_awx_conf_preload_expires', 100)
# Will fail test if database is used
@@ -374,13 +255,7 @@ def test_settings_use_cache(settings, mocker):
def test_settings_use_an_encrypted_cache(settings, mocker):
settings.registry.register(
'AWX_ENCRYPTED',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
encrypted=True
)
settings.registry.register('AWX_ENCRYPTED', field_class=fields.CharField, category=_('System'), category_slug='system', encrypted=True)
assert isinstance(settings.cache, EncryptedCacheProxy)
assert settings.cache.__dict__['encrypter'] == encrypt_field
assert settings.cache.__dict__['decrypter'] == decrypt_field
@@ -393,34 +268,18 @@ def test_settings_use_an_encrypted_cache(settings, mocker):
def test_sensitive_cache_data_is_encrypted(settings, mocker):
"fields marked as `encrypted` are stored in the cache with encryption"
settings.registry.register(
'AWX_ENCRYPTED',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
encrypted=True
)
settings.registry.register('AWX_ENCRYPTED', field_class=fields.CharField, category=_('System'), category_slug='system', encrypted=True)
def rot13(obj, attribute):
assert obj.pk == 123
return codecs.encode(getattr(obj, attribute), 'rot_13')
native_cache = LocMemCache(str(uuid4()), {})
cache = EncryptedCacheProxy(
native_cache,
settings.registry,
encrypter=rot13,
decrypter=rot13
)
cache = EncryptedCacheProxy(native_cache, settings.registry, encrypter=rot13, decrypter=rot13)
# Insert the setting value into the database; the encryption process will
# use its primary key as part of the encryption key
setting_from_db = mocker.Mock(pk=123, key='AWX_ENCRYPTED', value='SECRET!')
mocks = mocker.Mock(**{
'order_by.return_value': mocker.Mock(**{
'__iter__': lambda self: iter([setting_from_db]),
'first.return_value': setting_from_db
}),
})
mocks = mocker.Mock(**{'order_by.return_value': mocker.Mock(**{'__iter__': lambda self: iter([setting_from_db]), 'first.return_value': setting_from_db})})
with mocker.patch('awx.conf.models.Setting.objects.filter', return_value=mocks):
cache.set('AWX_ENCRYPTED', 'SECRET!')
assert cache.get('AWX_ENCRYPTED') == 'SECRET!'
@@ -429,26 +288,14 @@ def test_sensitive_cache_data_is_encrypted(settings, mocker):
def test_readonly_sensitive_cache_data_is_encrypted(settings):
"readonly fields marked as `encrypted` are stored in the cache with encryption"
settings.registry.register(
'AWX_ENCRYPTED',
field_class=fields.CharField,
category=_('System'),
category_slug='system',
read_only=True,
encrypted=True
)
settings.registry.register('AWX_ENCRYPTED', field_class=fields.CharField, category=_('System'), category_slug='system', read_only=True, encrypted=True)
def rot13(obj, attribute):
assert obj.pk is None
return codecs.encode(getattr(obj, attribute), 'rot_13')
native_cache = LocMemCache(str(uuid4()), {})
cache = EncryptedCacheProxy(
native_cache,
settings.registry,
encrypter=rot13,
decrypter=rot13
)
cache = EncryptedCacheProxy(native_cache, settings.registry, encrypter=rot13, decrypter=rot13)
cache.set('AWX_ENCRYPTED', 'SECRET!')
assert cache.get('AWX_ENCRYPTED') == 'SECRET!'
assert native_cache.get('AWX_ENCRYPTED') == 'FRPERG!'

View File

@@ -3,14 +3,10 @@
from django.conf.urls import url
from awx.conf.views import (
SettingCategoryList,
SettingSingletonDetail,
SettingLoggingTest,
)
from awx.conf.views import SettingCategoryList, SettingSingletonDetail, SettingLoggingTest
urlpatterns = [
urlpatterns = [
url(r'^$', SettingCategoryList.as_view(), name='setting_category_list'),
url(r'^(?P<category_slug>[a-z0-9-]+)/$', SettingSingletonDetail.as_view(), name='setting_singleton_detail'),
url(r'^logging/test/$', SettingLoggingTest.as_view(), name='setting_logging_test'),

View File

@@ -7,7 +7,4 @@ __all__ = ['conf_to_dict']
def conf_to_dict(obj):
return {
'category': settings_registry.get_setting_category(obj.key),
'name': obj.key,
}
return {'category': settings_registry.get_setting_category(obj.key), 'name': obj.key}

View File

@@ -21,13 +21,8 @@ from rest_framework.response import Response
from rest_framework import serializers
from rest_framework import status
# Tower
from awx.api.generics import (
APIView,
GenericAPIView,
ListAPIView,
RetrieveUpdateDestroyAPIView,
)
# AWX
from awx.api.generics import APIView, GenericAPIView, ListAPIView, RetrieveUpdateDestroyAPIView
from awx.api.permissions import IsSuperUser
from awx.api.versioning import reverse
from awx.main.utils import camelcase_to_underscore
@@ -81,9 +76,7 @@ class SettingSingletonDetail(RetrieveUpdateDestroyAPIView):
if self.category_slug not in category_slugs:
raise PermissionDenied()
registered_settings = settings_registry.get_registered_settings(
category_slug=self.category_slug, read_only=False,
)
registered_settings = settings_registry.get_registered_settings(category_slug=self.category_slug, read_only=False)
if self.category_slug == 'user':
return Setting.objects.filter(key__in=registered_settings, user=self.request.user)
else:
@@ -91,9 +84,7 @@ class SettingSingletonDetail(RetrieveUpdateDestroyAPIView):
def get_object(self):
settings_qs = self.get_queryset()
registered_settings = settings_registry.get_registered_settings(
category_slug=self.category_slug,
)
registered_settings = settings_registry.get_registered_settings(category_slug=self.category_slug)
all_settings = {}
for setting in settings_qs:
all_settings[setting.key] = setting.value
@@ -117,9 +108,7 @@ class SettingSingletonDetail(RetrieveUpdateDestroyAPIView):
for key, value in serializer.validated_data.items():
if key == 'LICENSE' or settings_registry.is_setting_read_only(key):
continue
if settings_registry.is_setting_encrypted(key) and \
isinstance(value, str) and \
value.startswith('$encrypted$'):
if settings_registry.is_setting_encrypted(key) and isinstance(value, str) and value.startswith('$encrypted$'):
continue
setattr(serializer.instance, key, value)
setting = settings_qs.filter(key=key).order_by('pk').first()
@@ -133,7 +122,6 @@ class SettingSingletonDetail(RetrieveUpdateDestroyAPIView):
if settings_change_list:
connection.on_commit(lambda: handle_setting_changes.delay(settings_change_list))
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
@@ -170,7 +158,7 @@ class SettingLoggingTest(GenericAPIView):
enabled = getattr(settings, 'LOG_AGGREGATOR_ENABLED', False)
if not enabled:
return Response({'error': 'Logging not enabled'}, status=status.HTTP_409_CONFLICT)
# Send test message to configured logger based on db settings
try:
default_logger = settings.LOG_AGGREGATOR_LOGGERS[0]
@@ -179,18 +167,15 @@ class SettingLoggingTest(GenericAPIView):
except IndexError:
default_logger = 'awx'
logging.getLogger(default_logger).error('AWX Connection Test Message')
hostname = getattr(settings, 'LOG_AGGREGATOR_HOST', None)
protocol = getattr(settings, 'LOG_AGGREGATOR_PROTOCOL', None)
try:
subprocess.check_output(
['rsyslogd', '-N1', '-f', '/var/lib/awx/rsyslog/rsyslog.conf'],
stderr=subprocess.STDOUT
)
subprocess.check_output(['rsyslogd', '-N1', '-f', '/var/lib/awx/rsyslog/rsyslog.conf'], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as exc:
return Response({'error': exc.output}, status=status.HTTP_400_BAD_REQUEST)
# Check to ensure port is open at host
if protocol in ['udp', 'tcp']:
port = getattr(settings, 'LOG_AGGREGATOR_PORT', None)
@@ -206,7 +191,7 @@ class SettingLoggingTest(GenericAPIView):
else:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.settimeout(.5)
s.settimeout(0.5)
s.connect((hostname, int(port)))
s.shutdown(SHUT_RDWR)
s.close()

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

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