Skip to content

Commit 1142252

Browse files
authored
secrets/transform: Add new fields for transform transformation resource. (#2820)
* rebased changes * added changelog entry * rebasing changes * Added support for config control group resource (#2840) * Rebased changes * Remove duplicate ControlGroupConfigResource from provider Removed duplicate sysconfig.NewControlGroupConfigResource entry from the resource list. * moved changes to unreleased section of changelog * removed extra space * changelog: keep only intended entry * rebased changes * added changelog entry * Added support for config control group resource (#2840) * Rebased changes * Remove duplicate ControlGroupConfigResource from provider Removed duplicate sysconfig.NewControlGroupConfigResource entry from the resource list. * moved changes to unreleased section of changelog * removed extra space * rebased changes * added changelog entry * rebased changes * changelog addition * Delete internal/vault/sys/config/control_group_resource_test.go * Delete internal/vault/sys/config/control_group_resource.go * Delete website/docs/r/config_control_group.html.md * Added support for config control group resource (#2840) * Rebased changes * Remove duplicate ControlGroupConfigResource from provider Removed duplicate sysconfig.NewControlGroupConfigResource entry from the resource list. * moved changes to unreleased section of changelog * removed extra space * rebased changes * rebased changes * changelog addition * Revise CHANGELOG for new features and fixes Updated CHANGELOG with new features, improvements, and bug fixes for the Vault provider. * Update CHANGELOG with new features and resources Added new resources for managing Vault UI headers, RADIUS auth backend, activation flags, and userpass authentication. Updated transformation resource with new fields. * Delete website/docs/r/config_control_group.html.md * Delete internal/vault/sys/config/control_group_resource_test.go * Delete internal/vault/sys/config/control_group_resource.go
1 parent a6deaff commit 1142252

5 files changed

Lines changed: 281 additions & 88 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ FEATURES:
88
* **New Resource**: `vault_activation_flags` for managing Vault features that are gated by one-time flags. Requires Vault 1.16 or later. Needs Vault enterprise licence([#2861](https://github.com/hashicorp/terraform-provider-vault/pull/2861/))
99
* **New Resources**: `vault_userpass_auth_backend_user` for user creation, deletion, password updates, and policy updates, and ephemeral resource `vault_userpass_auth_login` for authenticating with Userpass. ([#2859](https://github.com/hashicorp/terraform-provider-vault/pull/2859))
1010
* Add support for write only paramters for s3 backends for `vault_raft_snapshot_agent_config` by @drewmullen ([#2825]https://github.com/hashicorp/terraform-provider-vault/pull/2825)
11+
* `vault_transform_transformation`: Added `mapping_mode`, `stores` and `convergent` fields to the resource. ([#2820] https://github.com/hashicorp/terraform-provider-vault/pull/2820/)
1112

1213

1314
## 5.9.0 (April 22, 2026)

internal/consts/consts.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,13 @@ const (
314314
FieldRedundancyZonesJSON = "redundancy_zones_json"
315315
FieldServers = "servers"
316316
FieldServersJSON = "servers_json"
317+
FieldMaskingCharacter = "masking_character"
318+
FieldTemplate = "template"
319+
FieldTemplates = "templates"
320+
FieldTweakSource = "tweak_source"
321+
FieldMappingMode = "mapping_mode"
322+
FieldStores = "stores"
323+
FieldConvergent = "convergent"
317324
FieldUpgradeInfo = "upgrade_info"
318325
FieldUpgradeInfoJSON = "upgrade_info_json"
319326
FieldMaxVersions = "max_versions"

vault/resource_transform_transformation.go

Lines changed: 100 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import (
88
"log"
99
"strings"
1010

11+
"github.com/hashicorp/go-cty/cty"
1112
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1213

14+
"github.com/hashicorp/terraform-provider-vault/internal/consts"
1315
"github.com/hashicorp/terraform-provider-vault/internal/provider"
1416
"github.com/hashicorp/terraform-provider-vault/util"
1517
)
@@ -18,7 +20,7 @@ const transformTransformationEndpoint = "/transform/transformation/{name}"
1820

1921
func transformTransformationResource() *schema.Resource {
2022
fields := map[string]*schema.Schema{
21-
"path": {
23+
consts.FieldPath: {
2224
Type: schema.TypeString,
2325
Required: true,
2426
ForceNew: true,
@@ -27,52 +29,71 @@ func transformTransformationResource() *schema.Resource {
2729
return strings.Trim(v.(string), "/")
2830
},
2931
},
30-
"allowed_roles": {
32+
consts.FieldAllowedRoles: {
3133
Type: schema.TypeList,
3234
Elem: &schema.Schema{Type: schema.TypeString},
3335
Optional: true,
3436
Description: `The set of roles allowed to perform this transformation.`,
3537
},
36-
"masking_character": {
38+
consts.FieldMaskingCharacter: {
3739
Type: schema.TypeString,
3840
Optional: true,
3941
Description: `The character used to replace data when in masking mode`,
4042
},
41-
"name": {
43+
consts.FieldName: {
4244
Type: schema.TypeString,
4345
Required: true,
4446
Description: `The name of the transformation.`,
4547
ForceNew: true,
4648
},
47-
"template": {
49+
consts.FieldTemplate: {
4850
Type: schema.TypeString,
4951
Optional: true,
5052
Description: `The name of the template to use.`,
5153
},
52-
"templates": {
54+
consts.FieldTemplates: {
5355
Type: schema.TypeList,
5456
Elem: &schema.Schema{Type: schema.TypeString},
5557
Optional: true,
5658
Computed: true,
5759
Description: `Templates configured for transformation.`,
5860
},
59-
"tweak_source": {
61+
consts.FieldTweakSource: {
6062
Type: schema.TypeString,
6163
Optional: true,
6264
Description: `The source of where the tweak value comes from. Only valid when in FPE mode.`,
6365
},
64-
"type": {
66+
consts.FieldType: {
6567
Type: schema.TypeString,
6668
Optional: true,
6769
Description: `The type of transformation to perform.`,
6870
},
69-
"deletion_allowed": {
71+
consts.FieldDeletionAllowed: {
7072
Type: schema.TypeBool,
7173
Optional: true,
7274
Default: false,
7375
Description: `If true, this transform can be deleted. ` +
7476
`Otherwise deletion is blocked while this value remains false.`,
7577
},
78+
consts.FieldMappingMode: {
79+
Type: schema.TypeString,
80+
Optional: true,
81+
ForceNew: true,
82+
Description: `Specifies the mapping mode for stored values. Only used when type is "tokenization". Cannot be changed after creation.`,
83+
},
84+
consts.FieldStores: {
85+
Type: schema.TypeList,
86+
Elem: &schema.Schema{Type: schema.TypeString},
87+
Optional: true,
88+
ForceNew: true,
89+
Description: `List of stores to use for tokenization state. Only used when type is "tokenization". Cannot be changed after creation.`,
90+
},
91+
consts.FieldConvergent: {
92+
Type: schema.TypeBool,
93+
Optional: true,
94+
ForceNew: true,
95+
Description: `If true, multiple transformations of the same plaintext will produce the same ciphertext. Only used when type is "tokenization". Cannot be changed after creation.`,
96+
},
7697
}
7798
return &schema.Resource{
7899
Create: createTransformTransformationResource,
@@ -81,7 +102,7 @@ func transformTransformationResource() *schema.Resource {
81102
Exists: resourceTransformTransformationExists,
82103
Delete: deleteTransformTransformationResource,
83104
Importer: &schema.ResourceImporter{
84-
State: schema.ImportStatePassthrough,
105+
StateContext: schema.ImportStatePassthroughContext,
85106
},
86107
Schema: fields,
87108
}
@@ -93,30 +114,40 @@ func createTransformTransformationResource(d *schema.ResourceData, meta interfac
93114
return e
94115
}
95116

96-
path := d.Get("path").(string)
117+
path := d.Get(consts.FieldPath).(string)
97118
vaultPath := util.ParsePath(path, transformTransformationEndpoint, d)
98119
log.Printf("[DEBUG] Creating %q", vaultPath)
99120

100121
data := map[string]interface{}{}
101-
if v, ok := d.GetOkExists("allowed_roles"); ok {
102-
data["allowed_roles"] = v
122+
if v, ok := d.GetOkExists(consts.FieldAllowedRoles); ok {
123+
data[consts.FieldAllowedRoles] = v
103124
}
104-
if v, ok := d.GetOkExists("masking_character"); ok {
105-
data["masking_character"] = v
125+
if v, ok := d.GetOkExists(consts.FieldMaskingCharacter); ok {
126+
data[consts.FieldMaskingCharacter] = v
106127
}
107-
data["name"] = d.Get("name")
108-
if v, ok := d.GetOkExists("template"); ok {
109-
data["template"] = v
128+
data[consts.FieldName] = d.Get(consts.FieldName)
129+
if v, ok := d.GetOkExists(consts.FieldTemplate); ok {
130+
data[consts.FieldTemplate] = v
110131
}
111-
if v, ok := d.GetOkExists("tweak_source"); ok {
112-
data["tweak_source"] = v
132+
if v, ok := d.GetOkExists(consts.FieldTweakSource); ok {
133+
data[consts.FieldTweakSource] = v
113134
}
114-
if v, ok := d.GetOkExists("type"); ok {
115-
data["type"] = v
135+
if v, ok := d.GetOkExists(consts.FieldType); ok {
136+
data[consts.FieldType] = v
116137
}
117138

118139
if provider.IsAPISupported(meta, provider.VaultVersion112) {
119-
data["deletion_allowed"] = d.Get("deletion_allowed")
140+
data[consts.FieldDeletionAllowed] = d.Get(consts.FieldDeletionAllowed)
141+
}
142+
143+
if v, ok := d.GetOk(consts.FieldMappingMode); ok {
144+
data[consts.FieldMappingMode] = v
145+
}
146+
if v, ok := d.GetOk(consts.FieldStores); ok {
147+
data[consts.FieldStores] = v
148+
}
149+
if raw, _ := d.GetRawConfigAt(cty.GetAttrPath(consts.FieldConvergent)); !raw.IsNull() {
150+
data[consts.FieldConvergent] = d.Get(consts.FieldConvergent)
120151
}
121152

122153
log.Printf("[DEBUG] Writing %q", vaultPath)
@@ -156,39 +187,54 @@ func readTransformTransformationResource(d *schema.ResourceData, meta interface{
156187
return fmt.Errorf("error setting state %q, %q: %s", paramName, paramVal, err)
157188
}
158189
}
159-
if val, ok := resp.Data["allowed_roles"]; ok {
160-
if err := d.Set("allowed_roles", val); err != nil {
161-
return fmt.Errorf("error setting state key 'allowed_roles': %s", err)
190+
if val, ok := resp.Data[consts.FieldAllowedRoles]; ok {
191+
if err := d.Set(consts.FieldAllowedRoles, val); err != nil {
192+
return fmt.Errorf("error setting state key %q: %s", consts.FieldAllowedRoles, err)
162193
}
163194
}
164-
if val, ok := resp.Data["masking_character"]; ok {
165-
if err := d.Set("masking_character", val); err != nil {
166-
return fmt.Errorf("error setting state key 'masking_character': %s", err)
195+
if val, ok := resp.Data[consts.FieldMaskingCharacter]; ok {
196+
if err := d.Set(consts.FieldMaskingCharacter, val); err != nil {
197+
return fmt.Errorf("error setting state key %q: %s", consts.FieldMaskingCharacter, err)
167198
}
168199
}
169-
if val, ok := resp.Data["template"]; ok {
170-
if err := d.Set("template", val); err != nil {
171-
return fmt.Errorf("error setting state key 'template': %s", err)
200+
if val, ok := resp.Data[consts.FieldTemplate]; ok {
201+
if err := d.Set(consts.FieldTemplate, val); err != nil {
202+
return fmt.Errorf("error setting state key %q: %s", consts.FieldTemplate, err)
172203
}
173204
}
174-
if val, ok := resp.Data["templates"]; ok {
175-
if err := d.Set("templates", val); err != nil {
176-
return fmt.Errorf("error setting state key 'templates': %s", err)
205+
if val, ok := resp.Data[consts.FieldTemplates]; ok {
206+
if err := d.Set(consts.FieldTemplates, val); err != nil {
207+
return fmt.Errorf("error setting state key %q: %s", consts.FieldTemplates, err)
177208
}
178209
}
179-
if val, ok := resp.Data["tweak_source"]; ok {
180-
if err := d.Set("tweak_source", val); err != nil {
181-
return fmt.Errorf("error setting state key 'tweak_source': %s", err)
210+
if val, ok := resp.Data[consts.FieldTweakSource]; ok {
211+
if err := d.Set(consts.FieldTweakSource, val); err != nil {
212+
return fmt.Errorf("error setting state key %q: %s", consts.FieldTweakSource, err)
182213
}
183214
}
184-
if val, ok := resp.Data["type"]; ok {
185-
if err := d.Set("type", val); err != nil {
186-
return fmt.Errorf("error setting state key 'type': %s", err)
215+
if val, ok := resp.Data[consts.FieldType]; ok {
216+
if err := d.Set(consts.FieldType, val); err != nil {
217+
return fmt.Errorf("error setting state key %q: %s", consts.FieldType, err)
187218
}
188219
}
189220
if provider.IsAPISupported(meta, provider.VaultVersion112) {
190-
if err := d.Set("deletion_allowed", resp.Data["deletion_allowed"]); err != nil {
191-
return fmt.Errorf("error setting state key 'deletion_allowed': %s", err)
221+
if err := d.Set(consts.FieldDeletionAllowed, resp.Data[consts.FieldDeletionAllowed]); err != nil {
222+
return fmt.Errorf("error setting state key %q: %s", consts.FieldDeletionAllowed, err)
223+
}
224+
}
225+
if val, ok := resp.Data[consts.FieldMappingMode]; ok {
226+
if err := d.Set(consts.FieldMappingMode, val); err != nil {
227+
return fmt.Errorf("error setting state key %q: %s", consts.FieldMappingMode, err)
228+
}
229+
}
230+
if val, ok := resp.Data[consts.FieldStores]; ok {
231+
if err := d.Set(consts.FieldStores, val); err != nil {
232+
return fmt.Errorf("error setting state key %q: %s", consts.FieldStores, err)
233+
}
234+
}
235+
if val, ok := resp.Data[consts.FieldConvergent]; ok {
236+
if err := d.Set(consts.FieldConvergent, val); err != nil {
237+
return fmt.Errorf("error setting state key %q: %s", consts.FieldConvergent, err)
192238
}
193239
}
194240
return nil
@@ -204,24 +250,24 @@ func updateTransformTransformationResource(d *schema.ResourceData, meta interfac
204250
log.Printf("[DEBUG] Updating %q", vaultPath)
205251

206252
data := map[string]interface{}{}
207-
if raw, ok := d.GetOk("allowed_roles"); ok {
208-
data["allowed_roles"] = raw
253+
if raw, ok := d.GetOk(consts.FieldAllowedRoles); ok {
254+
data[consts.FieldAllowedRoles] = raw
209255
}
210-
if raw, ok := d.GetOk("masking_character"); ok {
211-
data["masking_character"] = raw
256+
if raw, ok := d.GetOk(consts.FieldMaskingCharacter); ok {
257+
data[consts.FieldMaskingCharacter] = raw
212258
}
213-
if raw, ok := d.GetOk("template"); ok {
214-
data["template"] = raw
259+
if raw, ok := d.GetOk(consts.FieldTemplate); ok {
260+
data[consts.FieldTemplate] = raw
215261
}
216-
if raw, ok := d.GetOk("tweak_source"); ok {
217-
data["tweak_source"] = raw
262+
if raw, ok := d.GetOk(consts.FieldTweakSource); ok {
263+
data[consts.FieldTweakSource] = raw
218264
}
219-
if raw, ok := d.GetOk("type"); ok {
220-
data["type"] = raw
265+
if raw, ok := d.GetOk(consts.FieldType); ok {
266+
data[consts.FieldType] = raw
221267
}
222268

223269
if provider.IsAPISupported(meta, provider.VaultVersion112) {
224-
data["deletion_allowed"] = d.Get("deletion_allowed")
270+
data[consts.FieldDeletionAllowed] = d.Get(consts.FieldDeletionAllowed)
225271
}
226272

227273
if _, err := client.Logical().Write(vaultPath, data); err != nil {

0 commit comments

Comments
 (0)