add working multivault select for templates form

This commit is contained in:
Jake McDermott 2017-12-12 02:04:21 -05:00
parent ef8af79700
commit 6759e60428
No known key found for this signature in database
GPG Key ID: 3B02CAD476EECB35
7 changed files with 211 additions and 236 deletions

View File

@ -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();

View File

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

View File

@ -129,7 +129,6 @@ function(NotificationsList, CompletedJobsList, i18n) {
credentials-to-post="credentialsToPost"
field-is-disabled="!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)">
</multi-credential>`,
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)'
}
},

View File

@ -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() {

View File

@ -34,14 +34,11 @@
</i>
</div>
<div class="MultiCredential-tag" ng-class="tag.readOnly ? 'MultiCredential-tag--disabled' : 'MultiCredential-tag--deletable'">
<span
class="MultiCredential-name--label
ng-binding">
{{ tag.kind }}
<span class="MultiCredential-name--label ng-binding">
{{ tag.kind }}
</span>
<span class="MultiCredential-name u-wordwrap
ng-binding">
{{ tag.name }}
<span class="MultiCredential-name u-wordwrapng-binding">
{{ tag.name }}
</span>
</div>
</div>

View File

@ -8,14 +8,10 @@
<i class="fa fa-search"></i>
</button>
</span>
<span class="form-control Form-textInput Form-textInput--variableHeight
input-medium lookup"
ng-class="{
'ng-invalid': credentialNotPresent,
'ng-dirty': fieldDirty
}"
ng-disabled="fieldIsDisabled"
style="padding: 4px 6px;">
<span class="form-control Form-textInput Form-textInput--variableHeight input-medium lookup"
ng-class="{'ng-dirty': fieldDirty}"
ng-disabled="fieldIsDisabled"
style="padding: 4px 6px;">
<div class="MultiCredential-tags">
<div class="MultiCredential-tagSection">
<div class="MultiCredential-flexContainer">
@ -24,14 +20,12 @@
<div class="MultiCredential-deleteContainer"
ng-click="removeCredential(tag.id)"
ng-hide="fieldIsDisabled || tag.readOnly">
<i class="fa fa-times MultiCredential-tagDelete">
</i>
<i class="fa fa-times MultiCredential-tagDelete"></i>
</div>
<div class="MultiCredential-tag"
ng-class="{'MultiCredential-tag--deletable': !fieldIsDisabled && !tag.readOnly, 'MultiCredential-tag--disabled': tag.readOnly}">
<span class="MultiCredential-name--label
ng-binding">
{{ tag.kind }}
<span class="MultiCredential-name--label ng-binding">
{{ tag.kind }}
</span>
<span class="MultiCredential-name u-wordwrap ng-binding">
{{ tag.name }}
@ -43,7 +37,3 @@
</div>
</span>
</div>
<div class="error" ng-cloak ng-show="credentialNotPresent && fieldDirty"
translate>
Please select a machine (SSH) credential or check the "Prompt on launch" option.
</div>

View File

@ -182,61 +182,61 @@ export default ['Rest', 'ProcessErrors', '$q', 'GetBasePath', function(Rest, Pro
let credentialGetPermissionDenied = false;
// get machine credential
if (data.related.credential) {
Rest.setUrl(data.related.credential);
credDefers.push(Rest.get()
.then(({data}) => {
selectedCredentials.machine = data;
})
.catch(({data, status}) => {
if (status === 403) {
/* User doesn't have read access to the machine credential, so use summary_fields */
credentialGetPermissionDenied = true;
selectedCredentials.machine = job_template_obj.summary_fields.credential;
selectedCredentials.machine.credential_type = job_template_obj.summary_fields.credential.credential_type_id;
selectedCredentials.machine.readOnly = true;
} else {
ProcessErrors(
null, data, status, null,
{
hdr: 'Error!',
msg: 'Failed to get machine credential. ' +
'Get returned status: ' +
status
});
}
}));
}
// if (data.related.credential) {
// Rest.setUrl(data.related.credential);
// credDefers.push(Rest.get()
// .then(({data}) => {
// selectedCredentials.machine = data;
// })
// .catch(({data, status}) => {
// if (status === 403) {
// /* User doesn't have read access to the machine credential, so use summary_fields */
// credentialGetPermissionDenied = true;
// selectedCredentials.machine = job_template_obj.summary_fields.credential;
// selectedCredentials.machine.credential_type = job_template_obj.summary_fields.credential.credential_type_id;
// selectedCredentials.machine.readOnly = true;
// } else {
// ProcessErrors(
// null, data, status, null,
// {
// hdr: 'Error!',
// msg: 'Failed to get machine credential. ' +
// 'Get returned status: ' +
// status
// });
// }
// }));
// }
if (data.related.vault_credential) {
Rest.setUrl(data.related.vault_credential);
credDefers.push(Rest.get()
.then(({data}) => {
selectedCredentials.vault = data;
})
.catch(({data, status}) => {
if (status === 403) {
/* User doesn't have read access to the vault credential, so use summary_fields */
credentialGetPermissionDenied = true;
selectedCredentials.vault = job_template_obj.summary_fields.vault_credential;
selectedCredentials.vault.credential_type = job_template_obj.summary_fields.vault_credential.credential_type_id;
selectedCredentials.vault.readOnly = true;
} else {
ProcessErrors(
null, data, status, null,
{
hdr: 'Error!',
msg: 'Failed to get machine credential. ' +
'Get returned status: ' +
status
});
}
}));
}
// if (data.related.vault_credential) {
// Rest.setUrl(data.related.vault_credential);
// credDefers.push(Rest.get()
// .then(({data}) => {
// selectedCredentials.vault = data;
// })
// .catch(({data, status}) => {
// if (status === 403) {
// /* User doesn't have read access to the vault credential, so use summary_fields */
// credentialGetPermissionDenied = true;
// selectedCredentials.vault = job_template_obj.summary_fields.vault_credential;
// selectedCredentials.vault.credential_type = job_template_obj.summary_fields.vault_credential.credential_type_id;
// selectedCredentials.vault.readOnly = true;
// } else {
// ProcessErrors(
// null, data, status, null,
// {
// hdr: 'Error!',
// msg: 'Failed to get machine credential. ' +
// 'Get returned status: ' +
// status
// });
// }
// }));
// }
// get extra credentials
if (data.related.extra_credentials) {
Rest.setUrl(data.related.extra_credentials);
if (data.related.credentials) {
Rest.setUrl(data.related.credentials);
credDefers.push(Rest.get()
.then(({data}) => {
selectedCredentials.extra = data.results;
@ -245,7 +245,7 @@ export default ['Rest', 'ProcessErrors', '$q', 'GetBasePath', function(Rest, Pro
if (status === 403) {
/* User doesn't have read access to the extra credentials, so use summary_fields */
credentialGetPermissionDenied = true;
selectedCredentials.extra = job_template_obj.summary_fields.extra_credentials;
selectedCredentials.extra = job_template_obj.summary_fields.credentials;
_.map(selectedCredentials.extra, (cred) => {
cred.credential_type = cred.credential_type_id;
cred.readOnly = true;