mirror of
https://github.com/ansible/awx.git
synced 2026-03-03 17:51:06 -03:30
Cycle or unset the webhook key if the webhook service changes
Also, tests.
This commit is contained in:
@@ -38,6 +38,7 @@ class WebhookKeyView(GenericAPIView):
|
|||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
obj = self.get_object()
|
obj = self.get_object()
|
||||||
obj.rotate_webhook_key()
|
obj.rotate_webhook_key()
|
||||||
|
obj.save(update_fields=['webhook_key'])
|
||||||
|
|
||||||
return Response({'webhook_key': obj.webhook_key}, status=status.HTTP_201_CREATED)
|
return Response({'webhook_key': obj.webhook_key}, status=status.HTTP_201_CREATED)
|
||||||
|
|
||||||
|
|||||||
@@ -515,4 +515,17 @@ class WebhookMixin(models.Model):
|
|||||||
|
|
||||||
def rotate_webhook_key(self):
|
def rotate_webhook_key(self):
|
||||||
self.webhook_key = get_random_string(length=50)
|
self.webhook_key = get_random_string(length=50)
|
||||||
self.save(update_fields=['webhook_key'])
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
update_fields = kwargs.get('update_fields')
|
||||||
|
|
||||||
|
if not self.pk or self._values_have_edits({'webhook_service': self.webhook_service}):
|
||||||
|
if self.webhook_service:
|
||||||
|
self.rotate_webhook_key()
|
||||||
|
else:
|
||||||
|
self.webhook_key = ''
|
||||||
|
|
||||||
|
if update_fields and 'webhook_service' in update_fields:
|
||||||
|
update_fields.append('webhook_key')
|
||||||
|
|
||||||
|
super().save(*args, **kwargs)
|
||||||
|
|||||||
@@ -154,12 +154,12 @@ def mk_job_template(name, job_type='run',
|
|||||||
organization=None, inventory=None,
|
organization=None, inventory=None,
|
||||||
credential=None, network_credential=None,
|
credential=None, network_credential=None,
|
||||||
cloud_credential=None, persisted=True, extra_vars='',
|
cloud_credential=None, persisted=True, extra_vars='',
|
||||||
project=None, spec=None):
|
project=None, spec=None, webhook_service=''):
|
||||||
if extra_vars:
|
if extra_vars:
|
||||||
extra_vars = json.dumps(extra_vars)
|
extra_vars = json.dumps(extra_vars)
|
||||||
|
|
||||||
jt = JobTemplate(name=name, job_type=job_type, extra_vars=extra_vars,
|
jt = JobTemplate(name=name, job_type=job_type, extra_vars=extra_vars,
|
||||||
playbook='helloworld.yml')
|
webhook_service=webhook_service, playbook='helloworld.yml')
|
||||||
|
|
||||||
jt.inventory = inventory
|
jt.inventory = inventory
|
||||||
if jt.inventory is None:
|
if jt.inventory is None:
|
||||||
@@ -200,11 +200,13 @@ def mk_workflow_job(status='new', workflow_job_template=None, extra_vars={},
|
|||||||
return job
|
return job
|
||||||
|
|
||||||
|
|
||||||
def mk_workflow_job_template(name, extra_vars='', spec=None, organization=None, persisted=True):
|
def mk_workflow_job_template(name, extra_vars='', spec=None, organization=None, persisted=True,
|
||||||
|
webhook_service=''):
|
||||||
if extra_vars:
|
if extra_vars:
|
||||||
extra_vars = json.dumps(extra_vars)
|
extra_vars = json.dumps(extra_vars)
|
||||||
|
|
||||||
wfjt = WorkflowJobTemplate(name=name, extra_vars=extra_vars, organization=organization)
|
wfjt = WorkflowJobTemplate(name=name, extra_vars=extra_vars, organization=organization,
|
||||||
|
webhook_service=webhook_service)
|
||||||
|
|
||||||
wfjt.survey_spec = spec
|
wfjt.survey_spec = spec
|
||||||
if wfjt.survey_spec:
|
if wfjt.survey_spec:
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ def create_survey_spec(variables=None, default_type='integer', required=True, mi
|
|||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
def create_job_template(name, roles=None, persisted=True, **kwargs):
|
def create_job_template(name, roles=None, persisted=True, webhook_service='', **kwargs):
|
||||||
Objects = generate_objects(["job_template", "jobs",
|
Objects = generate_objects(["job_template", "jobs",
|
||||||
"organization",
|
"organization",
|
||||||
"inventory",
|
"inventory",
|
||||||
@@ -252,11 +252,10 @@ def create_job_template(name, roles=None, persisted=True, **kwargs):
|
|||||||
else:
|
else:
|
||||||
spec = None
|
spec = None
|
||||||
|
|
||||||
jt = mk_job_template(name, project=proj,
|
jt = mk_job_template(name, project=proj, inventory=inv, credential=cred,
|
||||||
inventory=inv, credential=cred,
|
|
||||||
network_credential=net_cred, cloud_credential=cloud_cred,
|
network_credential=net_cred, cloud_credential=cloud_cred,
|
||||||
job_type=job_type, spec=spec, extra_vars=extra_vars,
|
job_type=job_type, spec=spec, extra_vars=extra_vars,
|
||||||
persisted=persisted)
|
persisted=persisted, webhook_service=webhook_service)
|
||||||
|
|
||||||
if 'jobs' in kwargs:
|
if 'jobs' in kwargs:
|
||||||
for i in kwargs['jobs']:
|
for i in kwargs['jobs']:
|
||||||
@@ -401,7 +400,7 @@ def generate_workflow_job_template_nodes(workflow_job_template,
|
|||||||
|
|
||||||
|
|
||||||
# TODO: Implement survey and jobs
|
# TODO: Implement survey and jobs
|
||||||
def create_workflow_job_template(name, organization=None, persisted=True, **kwargs):
|
def create_workflow_job_template(name, organization=None, persisted=True, webhook_service='', **kwargs):
|
||||||
Objects = generate_objects(["workflow_job_template",
|
Objects = generate_objects(["workflow_job_template",
|
||||||
"workflow_job_template_nodes",
|
"workflow_job_template_nodes",
|
||||||
"survey",], kwargs)
|
"survey",], kwargs)
|
||||||
@@ -418,7 +417,8 @@ def create_workflow_job_template(name, organization=None, persisted=True, **kwar
|
|||||||
organization=organization,
|
organization=organization,
|
||||||
spec=spec,
|
spec=spec,
|
||||||
extra_vars=extra_vars,
|
extra_vars=extra_vars,
|
||||||
persisted=persisted)
|
persisted=persisted,
|
||||||
|
webhook_service=webhook_service)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from awx.api.versioning import reverse
|
from awx.api.versioning import reverse
|
||||||
|
from awx.main.models.mixins import WebhookMixin
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
@@ -107,3 +108,41 @@ def test_post_webhook_key_wfjt(organization_factory, workflow_job_template_facto
|
|||||||
response = post(url, {}, user=user, expect=expect)
|
response = post(url, {}, user=user, expect=expect)
|
||||||
if expect < 400:
|
if expect < 400:
|
||||||
assert bool(response.data.get('webhook_key'))
|
assert bool(response.data.get('webhook_key'))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"service", [s for s, _ in WebhookMixin.SERVICES]
|
||||||
|
)
|
||||||
|
def test_set_webhook_service(organization_factory, job_template_factory, patch, service):
|
||||||
|
objs = organization_factory("org", superusers=['admin'])
|
||||||
|
jt = job_template_factory("jt", organization=objs.organization,
|
||||||
|
inventory='test_inv', project='test_proj').job_template
|
||||||
|
admin = objs.superusers.admin
|
||||||
|
assert (jt.webhook_service, jt.webhook_key) == ('', '')
|
||||||
|
|
||||||
|
url = reverse('api:job_template_detail', kwargs={'pk': jt.pk})
|
||||||
|
patch(url, {'webhook_service': service}, user=admin, expect=200)
|
||||||
|
jt.refresh_from_db()
|
||||||
|
|
||||||
|
assert jt.webhook_service == service
|
||||||
|
assert jt.webhook_key != ''
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"service", [s for s, _ in WebhookMixin.SERVICES]
|
||||||
|
)
|
||||||
|
def test_unset_webhook_service(organization_factory, job_template_factory, patch, service):
|
||||||
|
objs = organization_factory("org", superusers=['admin'])
|
||||||
|
jt = job_template_factory("jt", organization=objs.organization, webhook_service=service,
|
||||||
|
inventory='test_inv', project='test_proj').job_template
|
||||||
|
admin = objs.superusers.admin
|
||||||
|
assert jt.webhook_service == service
|
||||||
|
assert jt.webhook_key != ''
|
||||||
|
|
||||||
|
url = reverse('api:job_template_detail', kwargs={'pk': jt.pk})
|
||||||
|
patch(url, {'webhook_service': ''}, user=admin, expect=200)
|
||||||
|
jt.refresh_from_db()
|
||||||
|
|
||||||
|
assert (jt.webhook_service, jt.webhook_key) == ('', '')
|
||||||
|
|||||||
Reference in New Issue
Block a user