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 @@
-