mirror of
https://github.com/hashicorp/vault.git
synced 2025-08-16 19:47:02 +02:00
* Adding explicit MPL license for sub-package. This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository. * Adding explicit MPL license for sub-package. This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository. * Updating the license from MPL to Business Source License. Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at https://hashi.co/bsl-blog, FAQ at www.hashicorp.com/licensing-faq, and details of the license at www.hashicorp.com/bsl. * add missing license headers * Update copyright file headers to BUS-1.1 * Fix test that expected exact offset on hcl file --------- Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com> Co-authored-by: Sarah Thompson <sthompson@hashicorp.com> Co-authored-by: Brian Kassouf <bkassouf@hashicorp.com>
153 lines
4.6 KiB
JavaScript
153 lines
4.6 KiB
JavaScript
/**
|
||
* Copyright (c) HashiCorp, Inc.
|
||
* SPDX-License-Identifier: BUSL-1.1
|
||
*/
|
||
|
||
import Model, { attr } from '@ember-data/model';
|
||
import { withModelValidations } from 'vault/decorators/model-validations';
|
||
import { withFormFields } from 'vault/decorators/model-form-fields';
|
||
import lazyCapabilities, { apiPath } from 'vault/macros/lazy-capabilities';
|
||
import { tracked } from '@glimmer/tracking';
|
||
|
||
const validations = {
|
||
name: [{ type: 'presence', message: 'Name is required' }],
|
||
};
|
||
const formFieldProps = [
|
||
'name',
|
||
'serviceAccountName',
|
||
'kubernetesRoleType',
|
||
'kubernetesRoleName',
|
||
'allowedKubernetesNamespaces',
|
||
'tokenMaxTtl',
|
||
'tokenDefaultTtl',
|
||
'nameTemplate',
|
||
];
|
||
|
||
@withModelValidations(validations)
|
||
@withFormFields(formFieldProps)
|
||
export default class KubernetesRoleModel extends Model {
|
||
@attr('string') backend; // dynamic path of secret -- set on response from value passed to queryRecord
|
||
@attr('string', {
|
||
label: 'Role name',
|
||
subText: 'The role’s name in Vault.',
|
||
})
|
||
name;
|
||
|
||
@attr('string', {
|
||
label: 'Service account name',
|
||
subText: 'Vault will use the default template when generating service accounts, roles and role bindings.',
|
||
})
|
||
serviceAccountName;
|
||
|
||
@attr('string', {
|
||
label: 'Kubernetes role type',
|
||
editType: 'radio',
|
||
possibleValues: ['Role', 'ClusterRole'],
|
||
})
|
||
kubernetesRoleType;
|
||
|
||
@attr('string', {
|
||
label: 'Kubernetes role name',
|
||
subText: 'Vault will use the default template when generating service accounts, roles and role bindings.',
|
||
})
|
||
kubernetesRoleName;
|
||
|
||
@attr('string', {
|
||
label: 'Allowed Kubernetes namespaces',
|
||
subText:
|
||
'A list of the valid Kubernetes namespaces in which this role can be used for creating service accounts. If set to "*" all namespaces are allowed.',
|
||
})
|
||
allowedKubernetesNamespaces;
|
||
|
||
@attr({
|
||
label: 'Max Lease TTL',
|
||
editType: 'ttl',
|
||
})
|
||
tokenMaxTtl;
|
||
|
||
@attr({
|
||
label: 'Default Lease TTL',
|
||
editType: 'ttl',
|
||
})
|
||
tokenDefaultTtl;
|
||
|
||
@attr('string', {
|
||
label: 'Name template',
|
||
editType: 'optionalText',
|
||
defaultSubText:
|
||
'Vault will use the default template when generating service accounts, roles and role bindings.',
|
||
subText: 'Vault will use the default template when generating service accounts, roles and role bindings.',
|
||
})
|
||
nameTemplate;
|
||
|
||
@attr extraAnnotations;
|
||
@attr extraLabels;
|
||
|
||
@attr('string') generatedRoleRules;
|
||
|
||
@tracked _generationPreference;
|
||
get generationPreference() {
|
||
// when the user interacts with the radio cards the value will be set to the pseudo prop which takes precedence
|
||
if (this._generationPreference) {
|
||
return this._generationPreference;
|
||
}
|
||
// for existing roles, default the value based on which model prop has value -- only one can be set
|
||
let pref = null;
|
||
if (this.serviceAccountName) {
|
||
pref = 'basic';
|
||
} else if (this.kubernetesRoleName) {
|
||
pref = 'expanded';
|
||
} else if (this.generatedRoleRules) {
|
||
pref = 'full';
|
||
}
|
||
return pref;
|
||
}
|
||
set generationPreference(pref) {
|
||
// unset model props specific to filteredFormFields when changing preference
|
||
// only one of service_account_name, kubernetes_role_name or generated_role_rules can be set
|
||
const props = {
|
||
basic: ['kubernetesRoleType', 'kubernetesRoleName', 'generatedRoleRules', 'nameTemplate'],
|
||
expanded: ['serviceAccountName', 'generatedRoleRules'],
|
||
full: ['serviceAccountName', 'kubernetesRoleName'],
|
||
}[pref];
|
||
props.forEach((prop) => (this[prop] = null));
|
||
this._generationPreference = pref;
|
||
}
|
||
|
||
get filteredFormFields() {
|
||
// return different form fields based on generationPreference
|
||
const hiddenFieldIndices = {
|
||
basic: [2, 3, 7], // kubernetesRoleType, kubernetesRoleName and nameTemplate
|
||
expanded: [1], // serviceAccountName
|
||
full: [1, 3], // serviceAccountName and kubernetesRoleName
|
||
}[this.generationPreference];
|
||
|
||
return hiddenFieldIndices
|
||
? this.formFields.filter((field, index) => !hiddenFieldIndices.includes(index))
|
||
: null;
|
||
}
|
||
|
||
@lazyCapabilities(apiPath`${'backend'}/roles/${'name'}`, 'backend', 'name') rolePath;
|
||
@lazyCapabilities(apiPath`${'backend'}/creds/${'name'}`, 'backend', 'name') credsPath;
|
||
@lazyCapabilities(apiPath`${'backend'}/roles`, 'backend') rolesPath;
|
||
|
||
get canCreate() {
|
||
return this.rolePath.get('canCreate');
|
||
}
|
||
get canDelete() {
|
||
return this.rolePath.get('canDelete');
|
||
}
|
||
get canEdit() {
|
||
return this.rolePath.get('canUpdate');
|
||
}
|
||
get canRead() {
|
||
return this.rolePath.get('canRead');
|
||
}
|
||
get canList() {
|
||
return this.rolesPath.get('canList');
|
||
}
|
||
get canGenerateCreds() {
|
||
return this.credsPath.get('canCreate');
|
||
}
|
||
}
|