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 b35cdfd2dd..379496fe0c 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 @@ -280,25 +280,13 @@ data.ask_credential_on_launch = $scope.ask_credential_on_launch ? $scope.ask_credential_on_launch : false; data.job_tags = (Array.isArray($scope.job_tags)) ? $scope.job_tags.join() : ""; data.skip_tags = (Array.isArray($scope.skip_tags)) ? $scope.skip_tags.join() : ""; - if ($scope.selectedCredentials && $scope.selectedCredentials - .machine && $scope.selectedCredentials - .machine) { - data.credential = $scope.selectedCredentials - .machine.id; - } else { - data.credential = null; - } - if ($scope.selectedCredentials && $scope.selectedCredentials - .vault && $scope.selectedCredentials - .vault.id) { - data.vault_credential = $scope.selectedCredentials - .vault.id; - } else { - data.vault_credential = null; - } - data.extra_vars = ToJSON($scope.parseType, - $scope.variables, true); + // drop legacy 'credential' and 'vault_credential' keys from the creation request as they will + // be provided to the related credentials endpoint by the template save success handler. + delete data.credential; + delete data.vault_credential; + + data.extra_vars = ToJSON($scope.parseType, $scope.variables, true); // We only want to set the survey_enabled flag to // true for this job template if a survey exists @@ -361,8 +349,8 @@ MultiCredentialService .saveExtraCredentials({ - creds: $scope.selectedCredentials.extra, - url: data.related.extra_credentials + creds: $scope.credentialsToPost, + url: data.related.credentials }); var orgDefer = $q.defer(); 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 476223cd2e..19c2964e3b 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 @@ -375,17 +375,16 @@ export default }); } else { + // if (jobTemplateData.summary_fields.credential) { + // $scope.selectedCredentials.machine = jobTemplateData.summary_fields.credential; + // } - if (jobTemplateData.summary_fields.credential) { - $scope.selectedCredentials.machine = jobTemplateData.summary_fields.credential; - } + // if (jobTemplateData.summary_fields.vault_credential) { + // $scope.selectedCredentials.vault = jobTemplateData.summary_fields.vault_credential; + // } - if (jobTemplateData.summary_fields.vault_credential) { - $scope.selectedCredentials.vault = jobTemplateData.summary_fields.vault_credential; - } - - if (jobTemplateData.summary_fields.extra_credentials) { - $scope.selectedCredentials.extra = jobTemplateData.summary_fields.extra_credentials; + if (jobTemplateData.summary_fields.credentials) { + $scope.selectedCredentials.extra = jobTemplateData.summary_fields.credentials; } MultiCredentialService.getCredentialTypes() @@ -396,12 +395,12 @@ export default let machineAndVaultCreds = [], extraCreds = []; - if($scope.selectedCredentials.machine) { - machineAndVaultCreds.push($scope.selectedCredentials.machine); - } - if($scope.selectedCredentials.vault) { - machineAndVaultCreds.push($scope.selectedCredentials.vault); - } + //if($scope.selectedCredentials.machine) { + // machineAndVaultCreds.push($scope.selectedCredentials.machine); + //} + //if($scope.selectedCredentials.vault) { + // machineAndVaultCreds.push($scope.selectedCredentials.vault); + //} machineAndVaultCreds.map(cred => ({ name: cred.name, @@ -425,7 +424,8 @@ export default })); } - $scope.credentialsToPost = machineAndVaultCreds.concat(extraCreds); + //$scope.credentialsToPost = machineAndVaultCreds.concat(extraCreds); + $scope.credentialsToPost = extraCreds; $scope.$emit('jobTemplateLoaded', master); }); @@ -523,8 +523,8 @@ export default MultiCredentialService .findChangedExtraCredentials({ - creds: $scope.selectedCredentials.extra, - url: data.related.extra_credentials + creds: $scope.credentialsToPost, + url: data.related.credentials }); InstanceGroupsService.editInstanceGroups(instance_group_url, $scope.instance_groups) @@ -668,24 +668,13 @@ export default data.ask_credential_on_launch = $scope.ask_credential_on_launch ? $scope.ask_credential_on_launch : false; data.job_tags = (Array.isArray($scope.job_tags)) ? $scope.job_tags.join() : ""; data.skip_tags = (Array.isArray($scope.skip_tags)) ? $scope.skip_tags.join() : ""; - if ($scope.selectedCredentials && $scope.selectedCredentials - .machine && $scope.selectedCredentials - .machine.id) { - data.credential = $scope.selectedCredentials - .machine.id; - } else { - data.credential = null; - } - if ($scope.selectedCredentials && $scope.selectedCredentials - .vault && $scope.selectedCredentials - .vault.id) { - data.vault_credential = $scope.selectedCredentials - .vault.id; - } else { - data.vault_credential = null; - } - data.extra_vars = ToJSON($scope.parseType, - $scope.variables, true); + + // drop legacy 'credential' and 'vault_credential' keys from the update request as they will + // be provided to the related credentials endpoint by the template save success handler. + delete data.credential; + delete data.vault_credential; + + data.extra_vars = ToJSON($scope.parseType, $scope.variables, true); // We only want to set the survey_enabled flag to // true for this job template if a survey exists 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 891eb72dab..62921638d9 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 @@ -129,7 +129,6 @@ function(NotificationsList, CompletedJobsList, i18n) { credentials-to-post="credentialsToPost" field-is-disabled="!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)"> `, - required: true, awPopOver: i18n._('Select credentials that allow Tower to access the nodes this job will be ran against. You can only select one credential of each type. For machine credentials (SSH), checking "Prompt on launch" without selecting credentials will require you to select a machine credential at run time. If you select credentials and check "Prompt on launch", the selected credential(s) become the defaults that can be updated at run time.'), dataTitle: i18n._('Credentials'), dataPlacement: 'right', @@ -368,7 +367,7 @@ function(NotificationsList, CompletedJobsList, i18n) { }, save: { ngClick: 'formSave()', //$scope.function to call on click, optional - ngDisabled: "job_template_form.$invalid || credentialNotPresent",//true //Disable when $pristine or $invalid, optional and when can_edit = false, for permission reasons + ngDisabled: "job_template_form.$invalid",//true //Disable when $pristine or $invalid, optional and when can_edit = false, for permission reasons ngShow: '(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)' } }, diff --git a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js index 3675c04e41..2077bf933e 100644 --- a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js +++ b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.directive.js @@ -14,7 +14,16 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile' .then(kinds => { scope.credentialKinds = kinds; - scope.credentialKind = scope.selectedCredentials.machine && scope.selectedCredentials.machine.readOnly ? (scope.selectedCredentials.vault && scope.selectedCredentials.vault.readOnly ? "" + kinds.Network : "" + kinds.Vault) : "" + kinds.Machine; + const machineIsReadOnly = _.get(scope.selectedCredentials, 'machine.readOnly'); + const vaultIsReadOnly = _.get(scope.selectedCredentials, 'vault.readOnly'); + + if (!machineIsReadOnly) { + scope.credentialKind = `${kinds.Machine}`; + } else if (!vaultIsReadOnly) { + scope.credentialKind = `${kinds.Vault}`; + } else { + scope.credentialKind = `${kinds.Network}`; + } scope.showModal = function() { scope.modalHidden = false; @@ -83,13 +92,12 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile' 'GetBasePath', function($scope, CredentialList, i18n, qs, GetBasePath) { let updateExtraCredentialsList = function() { - let extraCredIds = $scope.selectedCredentials.extra - .map(cred => cred.id); + let extraCredIds = $scope.selectedCredentials.extra.map(cred => cred.id); $scope.credentials.forEach(cred => { - if (cred.credential_type !== $scope.credentialKinds.Machine) { - cred.checked = (extraCredIds - .indexOf(cred.id) > - 1) ? 1 : 0; - } + cred.checked = (extraCredIds.indexOf(cred.id) > - 1) ? 1 : 0; + // if (cred.credential_type !== $scope.credentialKinds.Machine) { + // cred.checked = (extraCredIds.indexOf(cred.id) > - 1) ? 1 : 0; + //} }); $scope.credTags = MultiCredentialService @@ -97,35 +105,35 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile' $scope.allCredentialTypeOptions); }; - let updateMachineCredentialList = function() { - $scope.credentials.forEach(cred => { - if (cred.credential_type === $scope.credentialKinds.Machine) { - cred.checked = ($scope.selectedCredentials - .machine !== null && - cred.id === $scope.selectedCredentials - .machine.id) ? 1 : 0; - } - }); + // let updateMachineCredentialList = function() { + // $scope.credentials.forEach(cred => { + // if (cred.credential_type === $scope.credentialKinds.Machine) { + // cred.checked = ($scope.selectedCredentials + // .machine !== null && + // cred.id === $scope.selectedCredentials + // .machine.id) ? 1 : 0; + // } + // }); - $scope.credTags = MultiCredentialService - .updateCredentialTags($scope.selectedCredentials, - $scope.allCredentialTypeOptions); - }; + // $scope.credTags = MultiCredentialService + // .updateCredentialTags($scope.selectedCredentials, + // $scope.allCredentialTypeOptions); + // }; - let updateVaultCredentialList = function() { - $scope.credentials.forEach(cred => { - if (cred.credential_type === $scope.credentialKinds.Vault) { - cred.checked = ($scope.selectedCredentials - .vault !== null && - cred.id === $scope.selectedCredentials - .vault.id) ? 1 : 0; - } - }); + // let updateVaultCredentialList = function() { + // $scope.credentials.forEach(cred => { + // if (cred.credential_type === $scope.credentialKinds.Vault) { + // cred.checked = ($scope.selectedCredentials + // .vault !== null && + // cred.id === $scope.selectedCredentials + // .vault.id) ? 1 : 0; + // } + // }); - $scope.credTags = MultiCredentialService - .updateCredentialTags($scope.selectedCredentials, - $scope.allCredentialTypeOptions); - }; + // $scope.credTags = MultiCredentialService + // .updateCredentialTags($scope.selectedCredentials, + // $scope.allCredentialTypeOptions); + // }; let uncheckAllCredentials = function() { $scope.credentials.forEach(cred => { @@ -161,6 +169,7 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile' } else { $scope.generateCredentialList(); } + updateExtraCredentialsList(); $scope.showModal(); } }); @@ -188,61 +197,64 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile' $scope.$watch('credentialKind', onCredentialKindChanged); + $scope.$watchCollection('credentials', updateExtraCredentialsList); + $scope.$watchCollection('selectedCredentials.extra', () => { + //$scope.$watchGroup(['credentials', 'selectedCredentials.extra'], () => { if($scope.credentials && $scope.credentials.length > 0) { if($scope.selectedCredentials.extra && - $scope.selectedCredentials.extra.length > 0 && - parseInt($scope.credentialKind) !== $scope.credentialKinds.Machine) { + $scope.selectedCredentials.extra.length > 0){ //&& + // parseInt($scope.credentialKind) !== $scope.credentialKinds.Machine) { updateExtraCredentialsList(); - } else if (parseInt($scope.credentialKind) !== $scope.credentialKinds.Machine) { + } else { //if (parseInt($scope.credentialKind) !== $scope.credentialKinds.Machine) { uncheckAllCredentials(); } } }); - $scope.$watch('selectedCredentials.machine', () => { - if($scope.selectedCredentials && - $scope.selectedCredentials.machine && - parseInt($scope.credentialKind) === $scope.credentialKinds.Machine) { - updateMachineCredentialList(); - } else { - uncheckAllCredentials(); - } - }); + // $scope.$watch('selectedCredentials.machine', () => { + // if($scope.selectedCredentials && + // $scope.selectedCredentials.machine && + // parseInt($scope.credentialKind) === $scope.credentialKinds.Machine) { + // updateMachineCredentialList(); + // } else { + // uncheckAllCredentials(); + // } + // }); - $scope.$watch('selectedCredentials.vault', () => { - if($scope.selectedCredentials && - $scope.selectedCredentials.vault && - parseInt($scope.credentialKind) === $scope.credentialKinds.Vault) { - updateVaultCredentialList(); - } else { - uncheckAllCredentials(); - } - }); + // $scope.$watch('selectedCredentials.vault', () => { + // if($scope.selectedCredentials && + // $scope.selectedCredentials.vault && + // parseInt($scope.credentialKind) === $scope.credentialKinds.Vault) { + // updateVaultCredentialList(); + // } else { + // uncheckAllCredentials(); + // } + // }); - $scope.$watchGroup(['credentials', - 'selectedCredentials.machine', - 'selectedCredentials.vault'], () => { - if($scope.credentials && - $scope.credentials.length > 0) { - if($scope.selectedCredentials && - $scope.selectedCredentials.machine && - parseInt($scope.credentialKind) === $scope.credentialKinds.Machine) { - updateMachineCredentialList(); - } else if($scope.selectedCredentials && - $scope.selectedCredentials.vault && - parseInt($scope.credentialKind) === $scope.credentialKinds.Vault) { - updateVaultCredentialList(); - } else if($scope.selectedCredentials && - $scope.selectedCredentials.extra && - $scope.selectedCredentials.extra.length > 0 && - parseInt($scope.credentialKind) !== $scope.credentialKinds.Machine) { - updateExtraCredentialsList(); - } else { - uncheckAllCredentials(); - } - } - }); + // $scope.$watchGroup(['credentials', + // 'selectedCredentials.machine', + // 'selectedCredentials.vault'], () => { + // if($scope.credentials && + // $scope.credentials.length > 0) { + // if($scope.selectedCredentials && + // $scope.selectedCredentials.machine && + // parseInt($scope.credentialKind) === $scope.credentialKinds.Machine) { + // updateMachineCredentialList(); + // } else if($scope.selectedCredentials && + // $scope.selectedCredentials.vault && + // parseInt($scope.credentialKind) === $scope.credentialKinds.Vault) { + // updateVaultCredentialList(); + // } else if($scope.selectedCredentials && + // $scope.selectedCredentials.extra && + // $scope.selectedCredentials.extra.length > 0 && + // parseInt($scope.credentialKind) !== $scope.credentialKinds.Machine) { + // updateExtraCredentialsList(); + // } else { + // uncheckAllCredentials(); + // } + // } + // }); }; $scope.$on('multiCredentialModalLinked', function() { @@ -250,39 +262,39 @@ export default ['templateUrl', 'Rest', 'GetBasePath', 'generateList', '$compile' }); $scope.toggle_row = function(selectedRow) { - if(parseInt($scope.credentialKind) === $scope.credentialKinds.Machine) { - if($scope.selectedCredentials && - $scope.selectedCredentials.machine && - $scope.selectedCredentials.machine.id === selectedRow.id) { - $scope.selectedCredentials.machine = null; - } else { - $scope.selectedCredentials.machine = _.cloneDeep(selectedRow); - } - }else if(parseInt($scope.credentialKind) === $scope.credentialKinds.Vault) { - if($scope.selectedCredentials && - $scope.selectedCredentials.vault && - $scope.selectedCredentials.vault.id === selectedRow.id) { - $scope.selectedCredentials.vault = null; - } else { - $scope.selectedCredentials.vault = _.cloneDeep(selectedRow); - } - } else { + // if(false) { //if(parseInt($scope.credentialKind) === $scope.credentialKinds.Machine) { + // if($scope.selectedCredentials && + // $scope.selectedCredentials.machine && + // $scope.selectedCredentials.machine.id === selectedRow.id) { + // $scope.selectedCredentials.machine = null; + // } else { + // $scope.selectedCredentials.machine = _.cloneDeep(selectedRow); + // } + // }else if (false) { //if(parseInt($scope.credentialKind) === $scope.credentialKinds.Vault) { + // if($scope.selectedCredentials && + // $scope.selectedCredentials.vault && + // $scope.selectedCredentials.vault.id === selectedRow.id) { + // $scope.selectedCredentials.vault = null; + // } else { + // $scope.selectedCredentials.vault = _.cloneDeep(selectedRow); + // } + // } else { let rowDeselected = false; for (let i = $scope.selectedCredentials.extra.length - 1; i >= 0; i--) { - if($scope.selectedCredentials.extra[i].id === selectedRow - .id) { - $scope.selectedCredentials.extra.splice(i, 1); - rowDeselected = true; - } else if(selectedRow.credential_type === $scope - .selectedCredentials.extra[i].credential_type) { + if($scope.selectedCredentials.extra[i].id === selectedRow.id) { + $scope.selectedCredentials.extra.splice(i, 1); + rowDeselected = true; + } else if(selectedRow.credential_type === $scope.selectedCredentials.extra[i].credential_type) { + if (selectedRow.credential_type !== $scope.credentialKinds.Vault) { $scope.selectedCredentials.extra.splice(i, 1); + } } } if(!rowDeselected) { $scope.selectedCredentials.extra .push(_.cloneDeep(selectedRow)); } - } + // } }; $scope.selectedCredentialsDirty = function() { diff --git a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html index f14933339e..45f2ee15f7 100644 --- a/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html +++ b/awx/ui/client/src/templates/job_templates/multi-credential/multi-credential-modal.partial.html @@ -34,14 +34,11 @@