Debounce when multiple copies of the same webhook event come in

This commit is contained in:
Jeff Bradberry
2019-09-04 16:47:30 -04:00
parent 095aa77857
commit 245931f603

View File

@@ -14,7 +14,7 @@ from rest_framework.response import Response
from awx.api import serializers from awx.api import serializers
from awx.api.generics import APIView, GenericAPIView from awx.api.generics import APIView, GenericAPIView
from awx.api.permissions import WebhookKeyPermission from awx.api.permissions import WebhookKeyPermission
from awx.main.models import JobTemplate, WorkflowJobTemplate from awx.main.models import Job, JobTemplate, WorkflowJob, WorkflowJobTemplate
logger = logging.getLogger('awx.api.views.webhooks') logger = logging.getLogger('awx.api.views.webhooks')
@@ -93,20 +93,36 @@ class WebhookReceiverBase(APIView):
@csrf_exempt @csrf_exempt
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
logger.error( logger.debug(
"**************************************\n" "headers: {}\n"
"{}\n" "data: {}\n".format(request.headers, request.data)
"{}\n".format(request.headers, request.data)
) )
obj = self.get_object() obj = self.get_object()
self.check_signature(obj) self.check_signature(obj)
event_type = self.get_event_type()
event_guid = self.get_event_guid()
kwargs = {
'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(status=status.HTTP_202_ACCEPTED)
data = { data = {
'tower_webhook_event_type': self.get_event_type(), 'tower_webhook_event_type': event_type,
'tower_webhook_event_guid': self.get_event_guid(), 'tower_webhook_event_guid': event_guid,
'tower_webhook_payload': request.data, 'tower_webhook_payload': request.data,
} }
new_job = obj.create_unified_job(extra_vars=json.dumps(data)) new_job = obj.create_unified_job(
webhook_service=obj.webhook_service,
webhook_credential=obj.webhook_credential,
webhook_guid=event_guid,
extra_vars=json.dumps(data)
)
new_job.signal_start() new_job.signal_start()
return Response(status=status.HTTP_202_ACCEPTED) return Response(status=status.HTTP_202_ACCEPTED)