Skip to content

Commit 2899385

Browse files
Add encryptionSpec for vertex_ai_index (#15144) (#10759)
[upstream:86a14c31368b2e5fe36aaae03ea4b6bdcc6b4656] Signed-off-by: Modular Magician <[email protected]>
1 parent 81a4618 commit 2899385

File tree

5 files changed

+117
-0
lines changed

5 files changed

+117
-0
lines changed

.changelog/15144.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
vertexai: added `kmsKeyName` field to `google_vertex_ai_index` resource
3+
```

google-beta/services/vertexai/resource_vertex_ai_index.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,23 @@ then existing content of the Index will be replaced by the data from the content
195195
Optional: true,
196196
Description: `The description of the Index.`,
197197
},
198+
"encryption_spec": {
199+
Type: schema.TypeList,
200+
Optional: true,
201+
ForceNew: true,
202+
Description: `Customer-managed encryption key spec for an Index. If set, this Index and all sub-resources of this Index will be secured by this key.`,
203+
MaxItems: 1,
204+
Elem: &schema.Resource{
205+
Schema: map[string]*schema.Schema{
206+
"kms_key_name": {
207+
Type: schema.TypeString,
208+
Required: true,
209+
ForceNew: true,
210+
Description: `Required. The Cloud KMS resource identifier of the customer managed encryption key used to protect a resource. Has the form: 'projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key'. The key needs to be in the same region as where the compute resource is created.`,
211+
},
212+
},
213+
},
214+
},
198215
"index_update_method": {
199216
Type: schema.TypeString,
200217
Optional: true,
@@ -338,6 +355,12 @@ func resourceVertexAIIndexCreate(d *schema.ResourceData, meta interface{}) error
338355
} else if v, ok := d.GetOkExists("index_update_method"); !tpgresource.IsEmptyValue(reflect.ValueOf(indexUpdateMethodProp)) && (ok || !reflect.DeepEqual(v, indexUpdateMethodProp)) {
339356
obj["indexUpdateMethod"] = indexUpdateMethodProp
340357
}
358+
encryptionSpecProp, err := expandVertexAIIndexEncryptionSpec(d.Get("encryption_spec"), d, config)
359+
if err != nil {
360+
return err
361+
} else if v, ok := d.GetOkExists("encryption_spec"); !tpgresource.IsEmptyValue(reflect.ValueOf(encryptionSpecProp)) && (ok || !reflect.DeepEqual(v, encryptionSpecProp)) {
362+
obj["encryptionSpec"] = encryptionSpecProp
363+
}
341364
effectiveLabelsProp, err := expandVertexAIIndexEffectiveLabels(d.Get("effective_labels"), d, config)
342365
if err != nil {
343366
return err
@@ -490,6 +513,9 @@ func resourceVertexAIIndexRead(d *schema.ResourceData, meta interface{}) error {
490513
if err := d.Set("index_update_method", flattenVertexAIIndexIndexUpdateMethod(res["indexUpdateMethod"], d, config)); err != nil {
491514
return fmt.Errorf("Error reading Index: %s", err)
492515
}
516+
if err := d.Set("encryption_spec", flattenVertexAIIndexEncryptionSpec(res["encryptionSpec"], d, config)); err != nil {
517+
return fmt.Errorf("Error reading Index: %s", err)
518+
}
493519
if err := d.Set("terraform_labels", flattenVertexAIIndexTerraformLabels(res["labels"], d, config)); err != nil {
494520
return fmt.Errorf("Error reading Index: %s", err)
495521
}
@@ -1001,6 +1027,23 @@ func flattenVertexAIIndexIndexUpdateMethod(v interface{}, d *schema.ResourceData
10011027
return v
10021028
}
10031029

1030+
func flattenVertexAIIndexEncryptionSpec(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1031+
if v == nil {
1032+
return nil
1033+
}
1034+
original := v.(map[string]interface{})
1035+
if len(original) == 0 {
1036+
return nil
1037+
}
1038+
transformed := make(map[string]interface{})
1039+
transformed["kms_key_name"] =
1040+
flattenVertexAIIndexEncryptionSpecKmsKeyName(original["kmsKeyName"], d, config)
1041+
return []interface{}{transformed}
1042+
}
1043+
func flattenVertexAIIndexEncryptionSpecKmsKeyName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1044+
return v
1045+
}
1046+
10041047
func flattenVertexAIIndexTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
10051048
if v == nil {
10061049
return v
@@ -1222,6 +1265,29 @@ func expandVertexAIIndexIndexUpdateMethod(v interface{}, d tpgresource.Terraform
12221265
return v, nil
12231266
}
12241267

1268+
func expandVertexAIIndexEncryptionSpec(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1269+
l := v.([]interface{})
1270+
if len(l) == 0 || l[0] == nil {
1271+
return nil, nil
1272+
}
1273+
raw := l[0]
1274+
original := raw.(map[string]interface{})
1275+
transformed := make(map[string]interface{})
1276+
1277+
transformedKmsKeyName, err := expandVertexAIIndexEncryptionSpecKmsKeyName(original["kms_key_name"], d, config)
1278+
if err != nil {
1279+
return nil, err
1280+
} else if val := reflect.ValueOf(transformedKmsKeyName); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1281+
transformed["kmsKeyName"] = transformedKmsKeyName
1282+
}
1283+
1284+
return transformed, nil
1285+
}
1286+
1287+
func expandVertexAIIndexEncryptionSpecKmsKeyName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1288+
return v, nil
1289+
}
1290+
12251291
func expandVertexAIIndexEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
12261292
if v == nil {
12271293
return map[string]string{}, nil

google-beta/services/vertexai/resource_vertex_ai_index_generated_meta.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ fields:
1212
- field: 'display_name'
1313
- field: 'effective_labels'
1414
provider_only: true
15+
- field: 'encryption_spec.kms_key_name'
1516
- field: 'etag'
1617
- field: 'index_stats.shards_count'
1718
- field: 'index_stats.vectors_count'

google-beta/services/vertexai/resource_vertex_ai_index_generated_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func TestAccVertexAIIndex_vertexAiIndexExample(t *testing.T) {
3636

3737
context := map[string]interface{}{
3838
"project": envvar.GetTestProjectFromEnv(),
39+
"kms_key_name": acctest.BootstrapKMSKeyInLocation(t, "us-central1").CryptoKey.Name,
3940
"random_suffix": acctest.RandString(t, 10),
4041
}
4142

@@ -59,6 +60,10 @@ func TestAccVertexAIIndex_vertexAiIndexExample(t *testing.T) {
5960

6061
func testAccVertexAIIndex_vertexAiIndexExample(context map[string]interface{}) string {
6162
return acctest.Nprintf(`
63+
resource "google_project_service_identity" "vertexai_sa" {
64+
service = "aiplatform.googleapis.com"
65+
}
66+
6267
resource "google_storage_bucket" "bucket" {
6368
name = "tf-test-vertex-ai-index-test%{random_suffix}"
6469
location = "us-central1"
@@ -76,6 +81,12 @@ resource "google_storage_bucket_object" "data" {
7681
EOF
7782
}
7883
84+
resource "google_kms_crypto_key_iam_member" "vertexai_encrypterdecrypter" {
85+
crypto_key_id = "%{kms_key_name}"
86+
role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
87+
member = google_project_service_identity.vertexai_sa.member
88+
}
89+
7990
resource "google_vertex_ai_index" "index" {
8091
labels = {
8192
foo = "bar"
@@ -98,7 +109,14 @@ resource "google_vertex_ai_index" "index" {
98109
}
99110
}
100111
}
112+
encryption_spec {
113+
kms_key_name = "%{kms_key_name}"
114+
}
101115
index_update_method = "BATCH_UPDATE"
116+
117+
depends_on = [
118+
google_kms_crypto_key_iam_member.vertexai_encrypterdecrypter,
119+
]
102120
}
103121
`, context)
104122
}
@@ -108,6 +126,7 @@ func TestAccVertexAIIndex_vertexAiIndexStreamingExample(t *testing.T) {
108126

109127
context := map[string]interface{}{
110128
"project": envvar.GetTestProjectFromEnv(),
129+
"kms_key_name": acctest.BootstrapKMSKeyInLocation(t, "us-central1").CryptoKey.Name,
111130
"random_suffix": acctest.RandString(t, 10),
112131
}
113132

website/docs/r/vertex_ai_index.html.markdown

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ To get more information about Index, see:
3232

3333

3434
```hcl
35+
resource "google_project_service_identity" "vertexai_sa" {
36+
service = "aiplatform.googleapis.com"
37+
}
38+
3539
resource "google_storage_bucket" "bucket" {
3640
name = "vertex-ai-index-test"
3741
location = "us-central1"
@@ -49,6 +53,12 @@ resource "google_storage_bucket_object" "data" {
4953
EOF
5054
}
5155
56+
resource "google_kms_crypto_key_iam_member" "vertexai_encrypterdecrypter" {
57+
crypto_key_id = "kms-name"
58+
role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
59+
member = google_project_service_identity.vertexai_sa.member
60+
}
61+
5262
resource "google_vertex_ai_index" "index" {
5363
labels = {
5464
foo = "bar"
@@ -71,7 +81,14 @@ resource "google_vertex_ai_index" "index" {
7181
}
7282
}
7383
}
84+
encryption_spec {
85+
kms_key_name = "kms-name"
86+
}
7487
index_update_method = "BATCH_UPDATE"
88+
89+
depends_on = [
90+
google_kms_crypto_key_iam_member.vertexai_encrypterdecrypter,
91+
]
7592
}
7693
```
7794
## Example Usage - Vertex Ai Index Streaming
@@ -151,6 +168,11 @@ The following arguments are supported:
151168
* BATCH_UPDATE: user can call indexes.patch with files on Cloud Storage of datapoints to update.
152169
* STREAM_UPDATE: user can call indexes.upsertDatapoints/DeleteDatapoints to update the Index and the updates will be applied in corresponding DeployedIndexes in nearly real-time.
153170

171+
* `encryption_spec` -
172+
(Optional)
173+
Customer-managed encryption key spec for an Index. If set, this Index and all sub-resources of this Index will be secured by this key.
174+
Structure is [documented below](#nested_encryption_spec).
175+
154176
* `region` -
155177
(Optional)
156178
The region of the index. eg us-central1
@@ -248,6 +270,12 @@ The following arguments are supported:
248270
The default percentage of leaf nodes that any query may be searched. Must be in
249271
range 1-100, inclusive. The default value is 10 (means 10%) if not set.
250272

273+
<a name="nested_encryption_spec"></a>The `encryption_spec` block supports:
274+
275+
* `kms_key_name` -
276+
(Required)
277+
Required. The Cloud KMS resource identifier of the customer managed encryption key used to protect a resource. Has the form: `projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key`. The key needs to be in the same region as where the compute resource is created.
278+
251279
## Attributes Reference
252280

253281
In addition to the arguments listed above, the following computed attributes are exported:

0 commit comments

Comments
 (0)