diff --git a/awx/ui/client/lib/components/relaunchButton/relaunchButton.component.js b/awx/ui/client/lib/components/relaunchButton/relaunchButton.component.js index df97883dc4..aa29a2b700 100644 --- a/awx/ui/client/lib/components/relaunchButton/relaunchButton.component.js +++ b/awx/ui/client/lib/components/relaunchButton/relaunchButton.component.js @@ -33,11 +33,12 @@ function atRelaunchCtrl ( ) { const jobPromises = [ jobObj.request('get', vm.job.id), - jobTemplate.optionsLaunch(vm.job.unified_job_template) + jobTemplate.optionsLaunch(vm.job.unified_job_template), + jobObj.getCredentials(vm.job.id) ]; $q.all(jobPromises) - .then(([jobRes, launchOptions]) => { + .then(([jobRes, launchOptions, jobCreds]) => { const populatedJob = jobRes.data; const jobTypeChoices = _.get( launchOptions, @@ -68,7 +69,11 @@ function atRelaunchCtrl ( relaunchHostType: option ? (option.name).toLowerCase() : null, prompts: { credentials: { - value: populatedJob.summary_fields.credentials || [] + value: populatedJob.summary_fields.credentials ? + _.merge( + jobCreds.data.results, + populatedJob.summary_fields.credentials + ) : [] }, variables: { value: populatedJob.extra_vars diff --git a/awx/ui/client/lib/models/Job.js b/awx/ui/client/lib/models/Job.js index 7dd58482a5..1e466b0e6d 100644 --- a/awx/ui/client/lib/models/Job.js +++ b/awx/ui/client/lib/models/Job.js @@ -48,6 +48,15 @@ function getStats () { }); } +function getCredentials (id) { + const req = { + method: 'GET', + url: `${this.path}${id}/credentials/` + }; + + return $http(req); +} + function JobModel (method, resource, config) { BaseModel.call(this, 'jobs'); @@ -56,6 +65,7 @@ function JobModel (method, resource, config) { this.postRelaunch = postRelaunch.bind(this); this.getRelaunch = getRelaunch.bind(this); this.getStats = getStats.bind(this); + this.getCredentials = getCredentials.bind(this); return this.create(method, resource, config); } diff --git a/awx/ui/client/src/templates/prompt/prompt.controller.js b/awx/ui/client/src/templates/prompt/prompt.controller.js index 6ea5c61aad..362e1223fe 100644 --- a/awx/ui/client/src/templates/prompt/prompt.controller.js +++ b/awx/ui/client/src/templates/prompt/prompt.controller.js @@ -56,10 +56,12 @@ export default [ 'Rest', 'GetBasePath', 'ProcessErrors', 'CredentialTypeModel', .then( (response) => { vm.promptDataClone.prompts.credentials.credentialTypes = {}; vm.promptDataClone.prompts.credentials.credentialTypeOptions = []; + let machineCredTypeId = null; response.data.results.forEach((credentialTypeRow => { vm.promptDataClone.prompts.credentials.credentialTypes[credentialTypeRow.id] = credentialTypeRow.kind; if(credentialTypeRow.kind.match(/^(cloud|net|ssh|vault)$/)) { if(credentialTypeRow.kind === 'ssh') { + machineCredTypeId = credentialTypeRow.id; vm.promptDataClone.prompts.credentials.credentialKind = credentialTypeRow.id.toString(); } vm.promptDataClone.prompts.credentials.credentialTypeOptions.push({ @@ -72,40 +74,33 @@ export default [ 'Rest', 'GetBasePath', 'ProcessErrors', 'CredentialTypeModel', vm.promptDataClone.prompts.credentials.passwords = {}; if(vm.promptDataClone.launchConf.passwords_needed_to_start) { + let machineCredPassObj = null; vm.promptDataClone.launchConf.passwords_needed_to_start.forEach((passwordNeeded) => { - if (passwordNeeded === "ssh_password") { - vm.promptDataClone.prompts.credentials.value.forEach((defaultCredential) => { - defaultCredential.passwords_needed.forEach((neededPassword) => { - if (neededPassword === "ssh_password") { - vm.promptDataClone.prompts.credentials.passwords.ssh = { + if (passwordNeeded === "ssh_password" || + passwordNeeded === "become_password" || + passwordNeeded === "ssh_key_unlock" + ) { + if (!machineCredPassObj) { + vm.promptDataClone.prompts.credentials.value.forEach((defaultCredential) => { + if (defaultCredential.kind && defaultCredential.kind === "ssh") { + machineCredPassObj = { id: defaultCredential.id, name: defaultCredential.name }; + } else if (defaultCredential.passwords_needed) { + defaultCredential.passwords_needed.forEach((neededPassword) => { + if (neededPassword === passwordNeeded) { + machineCredPassObj = { + id: defaultCredential.id, + name: defaultCredential.name + }; + } + }); } }); - }); - } else if (passwordNeeded === "become_password") { - vm.promptDataClone.prompts.credentials.value.forEach((defaultCredential) => { - defaultCredential.passwords_needed.forEach((neededPassword) => { - if (neededPassword === "become_password") { - vm.promptDataClone.prompts.credentials.passwords.become = { - id: defaultCredential.id, - name: defaultCredential.name - }; - } - }); - }); - } else if (passwordNeeded === "ssh_key_unlock") { - vm.promptDataClone.prompts.credentials.value.forEach((defaultCredential) => { - defaultCredential.passwords_needed.forEach((neededPassword) => { - if (neededPassword === "ssh_key_unlock") { - vm.promptDataClone.prompts.credentials.passwords.ssh_key_unlock = { - id: defaultCredential.id, - name: defaultCredential.name - }; - } - }); - }); + } + + vm.promptDataClone.prompts.credentials.passwords[passwordNeeded] = angular.copy(machineCredPassObj); } else if (passwordNeeded.startsWith("vault_password")) { let vault_id = null; if (passwordNeeded.includes('.')) { @@ -119,12 +114,15 @@ export default [ 'Rest', 'GetBasePath', 'ProcessErrors', 'CredentialTypeModel', // Loop across the default credentials to find the name of the // credential that requires a password vm.promptDataClone.prompts.credentials.value.forEach((defaultCredential) => { - if (defaultCredential.vault_id === vault_id) { - vm.promptDataClone.prompts.credentials.passwords.vault.push({ - id: defaultCredential.id, - name: defaultCredential.name, - vault_id: defaultCredential.vault_id - }); + if (vm.promptDataClone.prompts.credentials.credentialTypes[defaultCredential.credential_type] === "vault") { + let defaultCredVaultId = defaultCredential.vault_id || _.get(defaultCredential, 'inputs.vault_id') || null; + if (defaultCredVaultId === vault_id) { + vm.promptDataClone.prompts.credentials.passwords.vault.push({ + id: defaultCredential.id, + name: defaultCredential.name, + vault_id: defaultCredVaultId + }); + } } }); } diff --git a/awx/ui/client/src/templates/prompt/prompt.partial.html b/awx/ui/client/src/templates/prompt/prompt.partial.html index a25bef7e0b..79b23eedd8 100644 --- a/awx/ui/client/src/templates/prompt/prompt.partial.html +++ b/awx/ui/client/src/templates/prompt/prompt.partial.html @@ -34,7 +34,7 @@ diff --git a/awx/ui/client/src/templates/prompt/prompt.service.js b/awx/ui/client/src/templates/prompt/prompt.service.js index 2044b7f440..f29e3ca856 100644 --- a/awx/ui/client/src/templates/prompt/prompt.service.js +++ b/awx/ui/client/src/templates/prompt/prompt.service.js @@ -171,7 +171,7 @@ function PromptService (Empty, $filter) { if (key === "ssh_key_unlock") { launchData.credential_passwords.ssh_key_unlock = val.value; } else if (key !== "vault") { - launchData.credential_passwords[`${key}_password`] = val.value; + launchData.credential_passwords[`${key}`] = val.value; } else { _.each(val, (vaultCred) => { launchData.credential_passwords[vaultCred.vault_id ? `${key}_password.${vaultCred.vault_id}` : `${key}_password`] = vaultCred.value; @@ -198,7 +198,7 @@ function PromptService (Empty, $filter) { if (key === "ssh_key_unlock") { launchData.credential_passwords.ssh_key_unlock = val.value; } else if (key !== "vault") { - launchData.credential_passwords[`${key}_password`] = val.value; + launchData.credential_passwords[`${key}`] = val.value; } else { _.each(val, (vaultCred) => { launchData.credential_passwords[vaultCred.vault_id ? `${key}_password.${vaultCred.vault_id}` : `${key}_password`] = vaultCred.value; diff --git a/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.controller.js b/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.controller.js index 9a5c8feec3..f42792a822 100644 --- a/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.controller.js +++ b/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.controller.js @@ -35,9 +35,9 @@ export default if(cred.passwords_needed) { cred.passwords_needed.forEach((passwordNeeded => { if(passwordNeeded === 'ssh_password') { - delete scope.promptData.prompts.credentials.passwords.ssh; + delete scope.promptData.prompts.credentials.passwords.ssh_password; } else if(passwordNeeded === 'become_password') { - delete scope.promptData.prompts.credentials.passwords.become; + delete scope.promptData.prompts.credentials.passwords.become_password; } else if(passwordNeeded === 'ssh_key_unlock') { delete scope.promptData.prompts.credentials.passwords.ssh_key_unlock; } else if(passwordNeeded.startsWith("vault_password")) { @@ -50,10 +50,10 @@ export default })); } else if(cred.inputs && !_.isEmpty(cred.inputs)) { if(cred.inputs.password && cred.inputs.password === "ASK") { - delete scope.promptData.prompts.credentials.passwords.ssh; + delete scope.promptData.prompts.credentials.passwords.ssh_password; } if(cred.inputs.become_password && cred.inputs.become_password === "ASK") { - delete scope.promptData.prompts.credentials.passwords.become; + delete scope.promptData.prompts.credentials.passwords.become_password; } if(cred.inputs.ssh_key_unlock && cred.inputs.ssh_key_unlock === "ASK") { delete scope.promptData.prompts.credentials.passwords.ssh_key_unlock; @@ -72,13 +72,13 @@ export default let updateNeededPasswords = (cred) => { if(cred.inputs) { if(cred.inputs.password && cred.inputs.password === "ASK") { - scope.promptData.prompts.credentials.passwords.ssh = { + scope.promptData.prompts.credentials.passwords.ssh_password = { id: cred.id, name: cred.name }; } if(cred.inputs.become_password && cred.inputs.become_password === "ASK") { - scope.promptData.prompts.credentials.passwords.become = { + scope.promptData.prompts.credentials.passwords.become_password = { id: cred.id, name: cred.name }; @@ -291,10 +291,10 @@ export default }; if(passwordNeeded === "ssh_password") { - scope.promptData.prompts.credentials.passwords.ssh = credPassObj; + scope.promptData.prompts.credentials.passwords.ssh_password = credPassObj; } if(passwordNeeded === "become_password") { - scope.promptData.prompts.credentials.passwords.become = credPassObj; + scope.promptData.prompts.credentials.passwords.become_password = credPassObj; } if(passwordNeeded === "ssh_key_unlock") { scope.promptData.prompts.credentials.passwords.ssh_key_unlock = credPassObj; diff --git a/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.partial.html b/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.partial.html index 214401b55f..7b1ca2b093 100644 --- a/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.partial.html +++ b/awx/ui/client/src/templates/prompt/steps/credential/prompt-credential.partial.html @@ -45,13 +45,13 @@ -
+
{{ vm.strings.get('prompt.CREDENTIAL_PASSWORD_WARNING')}}
-
{{promptData.prompts.credentials.passwords.ssh.name || promptData.prompts.credentials.passwords.become.name || promptData.prompts.credentials.passwords.ssh_key_unlock.name}}
+
{{promptData.prompts.credentials.passwords.ssh_password.name || promptData.prompts.credentials.passwords.become_password.name || promptData.prompts.credentials.passwords.ssh_key_unlock.name}}
{{vaultCred.name}}
@@ -65,10 +65,10 @@
-
+
{{:: vm.strings.get('prompt.PASSWORDS_REQUIRED_HELP') }}
-
+
{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}
@@ -96,7 +96,7 @@
{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}
-
+
{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}
@@ -118,9 +118,9 @@
- + - +
{{:: vm.strings.get('prompt.PLEASE_ENTER_PASSWORD') }}