diff --git a/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js b/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js index 561d7581f1..218f3353f7 100644 --- a/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js +++ b/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js @@ -343,6 +343,7 @@ // be provided to the related credentials endpoint by the template save success handler. delete data.credential; delete data.vault_credential; + delete data.webhook_url; data.extra_vars = ToJSON($scope.parseType, $scope.extra_vars, true); diff --git a/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js b/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js index 3d76ebd3ee..2c2a20ecb3 100644 --- a/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js +++ b/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js @@ -64,6 +64,7 @@ export default $scope.webhook_service_options = null; $scope.playbook = null; $scope.webhook_service = null; + $scope.webhook_url = ''; $scope.mode = 'edit'; $scope.parseType = 'yaml'; $scope.showJobType = false; @@ -74,6 +75,7 @@ export default $scope.skip_tag_options = []; const virtualEnvs = ConfigData.custom_virtualenvs || []; $scope.custom_virtualenvs_options = virtualEnvs; + $scope.webhook_url_help = i18n._('Webhook services can launch jobs with this job template by making a POST request to this URL.'); SurveyControllerInit({ scope: $scope, @@ -179,7 +181,21 @@ export default // watch for changes to 'verbosity', ensure we keep our select2 in sync when it changes. $scope.$watch('verbosity', sync_verbosity_select2); - $scope.$watch('webhook_service', sync_webhook_service_select2); + $scope.$watch('webhook_service', (newValue) => { + if (newValue) { + // TODO: We'll need the host from the server. + const baseURL = window.location.origin; + if (typeof newValue === 'string') { + $scope.webhook_url = `${baseURL}${jobTemplateData.url}${newValue}`; + $scope.webhook_service = { value: newValue }; + } else { + $scope.webhook_url = `${baseURL}${jobTemplateData.url}${newValue.value}`; + } + } else { + $scope.webhook_url = ''; + } + sync_webhook_service_select2(); + }); } callback = function() { @@ -759,6 +775,7 @@ export default data.job_tags = (Array.isArray($scope.job_tags)) ? _.uniq($scope.job_tags).join() : ""; data.skip_tags = (Array.isArray($scope.skip_tags)) ? _.uniq($scope.skip_tags).join() : ""; + delete data.webhook_url; Rest.setUrl(defaultUrl + $state.params.job_template_id); Rest.patch(data) diff --git a/awx/ui/client/src/templates/job_templates/job-template.form.js b/awx/ui/client/src/templates/job_templates/job-template.form.js index fb29d0b1fd..cb416484e2 100644 --- a/awx/ui/client/src/templates/job_templates/job-template.form.js +++ b/awx/ui/client/src/templates/job_templates/job-template.form.js @@ -406,6 +406,19 @@ function(NotificationsList, i18n) { dataPlacement: 'right', dataContainer: "body", }, + webhook_url: { + label: i18n._('Webhook URL'), + type: 'text', + readonly: true, + //ngShow: "allow_webhooks && allow_webhooks !== 'false'", + column: 2, + awPopOver: "webhook_url_help", + awPopOverWatch: "webhook_url_help", + dataPlacement: 'top', + dataTitle: i18n._('Webhook URL'), + dataContainer: "body", + ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' + }, extra_vars: { label: i18n._('Extra Variables'), type: 'textarea',