@@ -710,6 +710,32 @@ resolution and up to nine fractional digits.`,
710710 },
711711 },
712712 },
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+ },
713739 "name" : {
714740 Type : schema .TypeString ,
715741 Computed : true ,
@@ -1256,6 +1282,9 @@ func resourceMemorystoreInstanceRead(d *schema.ResourceData, meta interface{}) e
12561282 if err := d .Set ("kms_key" , flattenMemorystoreInstanceKmsKey (res ["kmsKey" ], d , config )); err != nil {
12571283 return fmt .Errorf ("Error reading Instance: %s" , err )
12581284 }
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+ }
12591288 if err := d .Set ("terraform_labels" , flattenMemorystoreInstanceTerraformLabels (res ["labels" ], d , config )); err != nil {
12601289 return fmt .Errorf ("Error reading Instance: %s" , err )
12611290 }
@@ -2443,6 +2472,41 @@ func flattenMemorystoreInstanceKmsKey(v interface{}, d *schema.ResourceData, con
24432472 return v
24442473}
24452474
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+
24462510func flattenMemorystoreInstanceTerraformLabels (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
24472511 if v == nil {
24482512 return v
@@ -3317,5 +3381,49 @@ func resourceMemorystoreInstanceDecoder(d *schema.ResourceData, meta interface{}
33173381
33183382 }
33193383
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+ }
33203428 return res , nil
33213429}
0 commit comments