@@ -710,6 +710,32 @@ resolution and up to nine fractional digits.`,
710
710
},
711
711
},
712
712
},
713
+ "managed_server_ca" : {
714
+ Type : schema .TypeList ,
715
+ Computed : true ,
716
+ Description : `Instance's Certificate Authority. This field will only be populated if instance's transit_encryption_mode is SERVER_AUTHENTICATION` ,
717
+ Elem : & schema.Resource {
718
+ Schema : map [string ]* schema.Schema {
719
+ "ca_certs" : {
720
+ Type : schema .TypeList ,
721
+ Computed : true ,
722
+ Description : `The PEM encoded CA certificate chains for managed server authentication` ,
723
+ Elem : & schema.Resource {
724
+ Schema : map [string ]* schema.Schema {
725
+ "certificates" : {
726
+ Type : schema .TypeList ,
727
+ Computed : true ,
728
+ Description : `The certificates that form the CA chain, from leaf to root order` ,
729
+ Elem : & schema.Schema {
730
+ Type : schema .TypeString ,
731
+ },
732
+ },
733
+ },
734
+ },
735
+ },
736
+ },
737
+ },
738
+ },
713
739
"name" : {
714
740
Type : schema .TypeString ,
715
741
Computed : true ,
@@ -1256,6 +1282,9 @@ func resourceMemorystoreInstanceRead(d *schema.ResourceData, meta interface{}) e
1256
1282
if err := d .Set ("kms_key" , flattenMemorystoreInstanceKmsKey (res ["kmsKey" ], d , config )); err != nil {
1257
1283
return fmt .Errorf ("Error reading Instance: %s" , err )
1258
1284
}
1285
+ if err := d .Set ("managed_server_ca" , flattenMemorystoreInstanceManagedServerCa (res ["managedServerCa" ], d , config )); err != nil {
1286
+ return fmt .Errorf ("Error reading Instance: %s" , err )
1287
+ }
1259
1288
if err := d .Set ("terraform_labels" , flattenMemorystoreInstanceTerraformLabels (res ["labels" ], d , config )); err != nil {
1260
1289
return fmt .Errorf ("Error reading Instance: %s" , err )
1261
1290
}
@@ -2443,6 +2472,41 @@ func flattenMemorystoreInstanceKmsKey(v interface{}, d *schema.ResourceData, con
2443
2472
return v
2444
2473
}
2445
2474
2475
+ func flattenMemorystoreInstanceManagedServerCa (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
2476
+ if v == nil {
2477
+ return nil
2478
+ }
2479
+ original := v .(map [string ]interface {})
2480
+ if len (original ) == 0 {
2481
+ return nil
2482
+ }
2483
+ transformed := make (map [string ]interface {})
2484
+ transformed ["ca_certs" ] =
2485
+ flattenMemorystoreInstanceManagedServerCaCaCerts (original ["caCerts" ], d , config )
2486
+ return []interface {}{transformed }
2487
+ }
2488
+ func flattenMemorystoreInstanceManagedServerCaCaCerts (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
2489
+ if v == nil {
2490
+ return v
2491
+ }
2492
+ l := v .([]interface {})
2493
+ transformed := make ([]interface {}, 0 , len (l ))
2494
+ for _ , raw := range l {
2495
+ original := raw .(map [string ]interface {})
2496
+ if len (original ) < 1 {
2497
+ // Do not include empty json objects coming back from the api
2498
+ continue
2499
+ }
2500
+ transformed = append (transformed , map [string ]interface {}{
2501
+ "certificates" : flattenMemorystoreInstanceManagedServerCaCaCertsCertificates (original ["certificates" ], d , config ),
2502
+ })
2503
+ }
2504
+ return transformed
2505
+ }
2506
+ func flattenMemorystoreInstanceManagedServerCaCaCertsCertificates (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
2507
+ return v
2508
+ }
2509
+
2446
2510
func flattenMemorystoreInstanceTerraformLabels (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
2447
2511
if v == nil {
2448
2512
return v
@@ -3317,5 +3381,49 @@ func resourceMemorystoreInstanceDecoder(d *schema.ResourceData, meta interface{}
3317
3381
3318
3382
}
3319
3383
3384
+ // Such custom code is necessary as the instance's certificate authority has to be retrieved via a dedicated
3385
+ // getCertificateAuthority API.
3386
+ // See https://cloud.google.com/memorystore/docs/valkey/reference/rest/v1/projects.locations.instances/getCertificateAuthority
3387
+ // for details about this API.
3388
+ config := meta .(* transport_tpg.Config )
3389
+ userAgent , err := tpgresource .GenerateUserAgentString (d , config .UserAgent )
3390
+ if err != nil {
3391
+ return nil , err
3392
+ }
3393
+
3394
+ // Only instances with SERVER_AUTHENTICATION mode have certificate authority set
3395
+ if v , ok := res ["transitEncryptionMode" ].(string ); ok && v == "SERVER_AUTHENTICATION" {
3396
+ url , err := tpgresource .ReplaceVars (d , config , "{{MemorystoreBasePath}}projects/{{project}}/locations/{{region}}/instances/{{instance_id}}/certificateAuthority" )
3397
+ if err != nil {
3398
+ return nil , err
3399
+ }
3400
+
3401
+ billingProject := ""
3402
+
3403
+ project , err := tpgresource .GetProject (d , config )
3404
+ if err != nil {
3405
+ return nil , fmt .Errorf ("Error fetching project for instance: %s" , err )
3406
+ }
3407
+
3408
+ billingProject = project
3409
+
3410
+ // err == nil indicates that the billing_project value was found
3411
+ if bp , err := tpgresource .GetBillingProject (d , config ); err == nil {
3412
+ billingProject = bp
3413
+ }
3414
+
3415
+ certificateAuthority , err := transport_tpg .SendRequest (transport_tpg.SendRequestOptions {
3416
+ Config : config ,
3417
+ Method : "GET" ,
3418
+ Project : billingProject ,
3419
+ RawURL : url ,
3420
+ UserAgent : userAgent ,
3421
+ })
3422
+ if err != nil {
3423
+ return nil , fmt .Errorf ("Error reading certificateAuthority: %s" , err )
3424
+ }
3425
+
3426
+ res ["managedServerCa" ] = certificateAuthority ["managedServerCa" ]
3427
+ }
3320
3428
return res , nil
3321
3429
}
0 commit comments