2015-08-20 19:52:30 +00:00
package google
import (
2017-10-31 23:27:03 +00:00
"crypto/sha256"
2017-10-12 16:21:35 +00:00
"errors"
2015-08-20 19:52:30 +00:00
"fmt"
"log"
2018-03-22 16:53:24 +00:00
"github.com/hashicorp/errwrap"
2015-08-20 19:52:30 +00:00
"github.com/hashicorp/terraform/helper/schema"
2018-03-22 16:53:24 +00:00
computeBeta "google.golang.org/api/compute/v0.beta"
2015-08-20 19:52:30 +00:00
)
func resourceComputeBackendService ( ) * schema . Resource {
return & schema . Resource {
Create : resourceComputeBackendServiceCreate ,
Read : resourceComputeBackendServiceRead ,
Update : resourceComputeBackendServiceUpdate ,
Delete : resourceComputeBackendServiceDelete ,
2017-06-14 21:13:52 +00:00
Importer : & schema . ResourceImporter {
State : schema . ImportStatePassthrough ,
} ,
2017-10-04 23:49:02 +00:00
SchemaVersion : 1 ,
2015-08-20 19:52:30 +00:00
Schema : map [ string ] * schema . Schema {
2016-04-10 21:34:15 +00:00
"name" : & schema . Schema {
2017-07-07 19:48:29 +00:00
Type : schema . TypeString ,
Required : true ,
ForceNew : true ,
ValidateFunc : validateGCPName ,
2016-04-10 21:34:15 +00:00
} ,
"health_checks" : & schema . Schema {
Type : schema . TypeSet ,
Elem : & schema . Schema { Type : schema . TypeString } ,
2018-03-22 16:53:24 +00:00
Set : selfLinkRelativePathHash ,
2017-06-20 17:26:09 +00:00
Required : true ,
MinItems : 1 ,
MaxItems : 1 ,
2016-04-10 21:34:15 +00:00
} ,
2017-10-31 23:27:03 +00:00
"iap" : & schema . Schema {
Type : schema . TypeList ,
Optional : true ,
MaxItems : 1 ,
Elem : & schema . Resource {
Schema : map [ string ] * schema . Schema {
"oauth2_client_id" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
} ,
"oauth2_client_secret" : & schema . Schema {
Type : schema . TypeString ,
Required : true ,
Sensitive : true ,
DiffSuppressFunc : func ( k , old , new string , d * schema . ResourceData ) bool {
if old == fmt . Sprintf ( "%x" , sha256 . Sum256 ( [ ] byte ( new ) ) ) {
return true
}
return false
} ,
} ,
} ,
} ,
} ,
2015-08-20 19:52:30 +00:00
"backend" : & schema . Schema {
2017-10-31 23:27:03 +00:00
Type : schema . TypeSet ,
Optional : true ,
Set : resourceGoogleComputeBackendServiceBackendHash ,
2015-08-20 19:52:30 +00:00
Elem : & schema . Resource {
Schema : map [ string ] * schema . Schema {
2016-04-10 21:34:15 +00:00
"group" : & schema . Schema {
2017-10-04 23:49:02 +00:00
Type : schema . TypeString ,
2017-10-12 16:21:35 +00:00
Optional : true ,
2017-10-04 23:49:02 +00:00
DiffSuppressFunc : compareSelfLinkRelativePaths ,
2016-04-10 21:34:15 +00:00
} ,
2015-08-20 19:52:30 +00:00
"balancing_mode" : & schema . Schema {
Type : schema . TypeString ,
Optional : true ,
Default : "UTILIZATION" ,
} ,
"capacity_scaler" : & schema . Schema {
Type : schema . TypeFloat ,
Optional : true ,
Default : 1 ,
} ,
"description" : & schema . Schema {
Type : schema . TypeString ,
Optional : true ,
} ,
"max_rate" : & schema . Schema {
Type : schema . TypeInt ,
Optional : true ,
} ,
"max_rate_per_instance" : & schema . Schema {
Type : schema . TypeFloat ,
Optional : true ,
} ,
2018-04-19 21:00:34 +00:00
"max_connections" : & schema . Schema {
Type : schema . TypeInt ,
Optional : true ,
} ,
"max_connections_per_instance" : & schema . Schema {
Type : schema . TypeInt ,
Optional : true ,
} ,
2015-08-20 19:52:30 +00:00
"max_utilization" : & schema . Schema {
Type : schema . TypeFloat ,
Optional : true ,
Default : 0.8 ,
} ,
} ,
} ,
} ,
2018-03-16 17:50:32 +00:00
"cdn_policy" : & schema . Schema {
Type : schema . TypeList ,
Optional : true ,
2018-03-16 20:56:27 +00:00
Computed : true ,
2018-03-16 17:50:32 +00:00
MaxItems : 1 ,
Elem : & schema . Resource {
Schema : map [ string ] * schema . Schema {
"cache_key_policy" : & schema . Schema {
Type : schema . TypeList ,
Optional : true ,
MaxItems : 1 ,
Elem : & schema . Resource {
Schema : map [ string ] * schema . Schema {
"include_host" : & schema . Schema {
Type : schema . TypeBool ,
Optional : true ,
} ,
"include_protocol" : & schema . Schema {
Type : schema . TypeBool ,
Optional : true ,
} ,
"include_query_string" : & schema . Schema {
Type : schema . TypeBool ,
Optional : true ,
} ,
"query_string_blacklist" : & schema . Schema {
Type : schema . TypeSet ,
Optional : true ,
Elem : & schema . Schema { Type : schema . TypeString } ,
ConflictsWith : [ ] string { "cdn_policy.0.cache_key_policy.query_string_whitelist" } ,
} ,
"query_string_whitelist" : & schema . Schema {
Type : schema . TypeSet ,
Optional : true ,
Elem : & schema . Schema { Type : schema . TypeString } ,
ConflictsWith : [ ] string { "cdn_policy.0.cache_key_policy.query_string_blacklist" } ,
} ,
} ,
} ,
} ,
} ,
} ,
} ,
2018-05-29 20:29:40 +00:00
"custom_request_headers" : & schema . Schema {
2018-11-06 23:27:56 +00:00
Removed : "This field is in beta. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details." ,
Type : schema . TypeSet ,
Optional : true ,
Elem : & schema . Schema { Type : schema . TypeString } ,
Set : schema . HashString ,
2018-05-29 20:29:40 +00:00
} ,
2015-08-20 19:52:30 +00:00
"description" : & schema . Schema {
Type : schema . TypeString ,
Optional : true ,
} ,
2016-07-28 20:38:09 +00:00
"enable_cdn" : & schema . Schema {
Type : schema . TypeBool ,
Optional : true ,
2016-07-28 21:57:33 +00:00
Default : false ,
2016-07-28 20:38:09 +00:00
} ,
2016-04-10 21:34:15 +00:00
"fingerprint" : & schema . Schema {
2015-08-20 19:52:30 +00:00
Type : schema . TypeString ,
2016-04-10 21:34:15 +00:00
Computed : true ,
2015-08-20 19:52:30 +00:00
} ,
"port_name" : & schema . Schema {
Type : schema . TypeString ,
Optional : true ,
Computed : true ,
} ,
2016-04-10 21:34:15 +00:00
"project" : & schema . Schema {
2015-08-20 19:52:30 +00:00
Type : schema . TypeString ,
Optional : true ,
2017-11-28 00:32:20 +00:00
Computed : true ,
2016-04-10 21:34:15 +00:00
ForceNew : true ,
2015-08-20 19:52:30 +00:00
} ,
2016-04-10 21:34:15 +00:00
"protocol" : & schema . Schema {
Type : schema . TypeString ,
2015-08-20 19:52:30 +00:00
Optional : true ,
Computed : true ,
} ,
2016-04-10 21:34:15 +00:00
"region" : & schema . Schema {
2017-03-14 00:25:32 +00:00
Type : schema . TypeString ,
Optional : true ,
ForceNew : true ,
2017-05-09 10:10:14 +00:00
Removed : "region has been removed as it was never used. For internal load balancing, use google_compute_region_backend_service" ,
2015-08-20 19:52:30 +00:00
} ,
2018-03-22 16:53:24 +00:00
"security_policy" : & schema . Schema {
Type : schema . TypeString ,
Optional : true ,
DiffSuppressFunc : compareSelfLinkOrResourceName ,
} ,
2015-08-20 19:52:30 +00:00
"self_link" : & schema . Schema {
Type : schema . TypeString ,
Computed : true ,
} ,
2016-04-10 16:59:57 +00:00
2016-11-27 19:12:56 +00:00
"session_affinity" : & schema . Schema {
Type : schema . TypeString ,
Optional : true ,
Computed : true ,
} ,
2016-04-10 21:34:15 +00:00
"timeout_sec" : & schema . Schema {
Type : schema . TypeInt ,
2016-04-10 16:59:57 +00:00
Optional : true ,
2016-04-10 21:34:15 +00:00
Computed : true ,
2016-04-10 16:59:57 +00:00
} ,
2017-06-07 22:17:49 +00:00
"connection_draining_timeout_sec" : & schema . Schema {
Type : schema . TypeInt ,
Optional : true ,
2017-09-07 19:56:53 +00:00
Default : 300 ,
2017-06-07 22:17:49 +00:00
} ,
2015-08-20 19:52:30 +00:00
} ,
}
}
func resourceComputeBackendServiceCreate ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
2017-10-12 16:21:35 +00:00
service , err := expandBackendService ( d )
if err != nil {
return err
}
2017-06-07 22:17:49 +00:00
2016-04-10 16:59:57 +00:00
project , err := getProject ( d , config )
if err != nil {
return err
}
2015-08-20 19:52:30 +00:00
log . Printf ( "[DEBUG] Creating new Backend Service: %#v" , service )
2018-05-29 20:29:40 +00:00
op , err := config . clientComputeBeta . BackendServices . Insert (
2017-10-12 16:21:35 +00:00
project , service ) . Do ( )
2015-08-20 19:52:30 +00:00
if err != nil {
return fmt . Errorf ( "Error creating backend service: %s" , err )
}
log . Printf ( "[DEBUG] Waiting for new backend service, operation: %#v" , op )
2017-05-02 21:01:05 +00:00
// Store the ID now
2015-08-20 19:52:30 +00:00
d . SetId ( service . Name )
2017-05-02 21:01:05 +00:00
// Wait for the operation to complete
2018-05-29 20:29:40 +00:00
waitErr := computeSharedOperationWait ( config . clientCompute , op , project , "Creating Backend Service" )
2017-05-02 21:01:05 +00:00
if waitErr != nil {
// The resource didn't actually create
d . SetId ( "" )
return waitErr
2015-08-20 19:52:30 +00:00
}
2018-03-22 16:53:24 +00:00
if v , ok := d . GetOk ( "security_policy" ) ; ok {
pol , err := ParseSecurityPolicyFieldValue ( v . ( string ) , d , config )
op , err := config . clientComputeBeta . BackendServices . SetSecurityPolicy (
project , service . Name , & computeBeta . SecurityPolicyReference {
SecurityPolicy : pol . RelativeLink ( ) ,
} ) . Do ( )
if err != nil {
return errwrap . Wrapf ( "Error setting Backend Service security policy: {{err}}" , err )
}
waitErr := computeSharedOperationWait ( config . clientCompute , op , project , "Adding Backend Service Security Policy" )
if waitErr != nil {
return waitErr
}
}
2015-08-20 19:52:30 +00:00
return resourceComputeBackendServiceRead ( d , meta )
}
func resourceComputeBackendServiceRead ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
2016-04-10 16:59:57 +00:00
project , err := getProject ( d , config )
if err != nil {
return err
}
2018-05-09 18:24:40 +00:00
service , err := config . clientComputeBeta . BackendServices . Get ( project , d . Id ( ) ) . Do ( )
if err != nil {
return handleNotFoundError ( err , d , fmt . Sprintf ( "Backend Service %q" , d . Get ( "name" ) . ( string ) ) )
2015-08-20 19:52:30 +00:00
}
2017-06-14 21:13:52 +00:00
d . Set ( "name" , service . Name )
2015-08-20 19:52:30 +00:00
d . Set ( "description" , service . Description )
2016-07-28 20:38:09 +00:00
d . Set ( "enable_cdn" , service . EnableCDN )
2015-08-20 19:52:30 +00:00
d . Set ( "port_name" , service . PortName )
d . Set ( "protocol" , service . Protocol )
2016-11-27 19:12:56 +00:00
d . Set ( "session_affinity" , service . SessionAffinity )
2015-08-20 19:52:30 +00:00
d . Set ( "timeout_sec" , service . TimeoutSec )
d . Set ( "fingerprint" , service . Fingerprint )
2018-05-09 18:24:40 +00:00
d . Set ( "self_link" , ConvertSelfLinkToV1 ( service . SelfLink ) )
2015-08-20 19:52:30 +00:00
d . Set ( "backend" , flattenBackends ( service . Backends ) )
2017-06-07 22:17:49 +00:00
d . Set ( "connection_draining_timeout_sec" , service . ConnectionDraining . DrainingTimeoutSec )
2017-10-31 23:27:03 +00:00
d . Set ( "iap" , flattenIap ( service . Iap ) )
2017-11-28 00:32:20 +00:00
d . Set ( "project" , project )
2015-08-20 19:52:30 +00:00
d . Set ( "health_checks" , service . HealthChecks )
2018-03-16 17:50:32 +00:00
if err := d . Set ( "cdn_policy" , flattenCdnPolicy ( service . CdnPolicy ) ) ; err != nil {
return err
}
2018-03-22 16:53:24 +00:00
d . Set ( "security_policy" , service . SecurityPolicy )
2015-08-20 19:52:30 +00:00
2018-11-06 23:27:56 +00:00
d . Set ( "custom_request_headers" , nil )
2015-08-20 19:52:30 +00:00
return nil
}
func resourceComputeBackendServiceUpdate ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
2017-10-12 16:21:35 +00:00
service , err := expandBackendService ( d )
if err != nil {
return err
}
2017-09-07 19:56:53 +00:00
service . Fingerprint = d . Get ( "fingerprint" ) . ( string )
2016-04-10 16:59:57 +00:00
project , err := getProject ( d , config )
if err != nil {
return err
}
2015-08-20 19:52:30 +00:00
log . Printf ( "[DEBUG] Updating existing Backend Service %q: %#v" , d . Id ( ) , service )
2018-05-29 20:29:40 +00:00
op , err := config . clientComputeBeta . BackendServices . Update (
2017-10-12 16:21:35 +00:00
project , d . Id ( ) , service ) . Do ( )
2015-08-20 19:52:30 +00:00
if err != nil {
return fmt . Errorf ( "Error updating backend service: %s" , err )
}
2018-05-29 20:29:40 +00:00
err = computeSharedOperationWait ( config . clientCompute , op , project , "Updating Backend Service" )
2015-08-20 19:52:30 +00:00
if err != nil {
2015-09-24 20:30:12 +00:00
return err
2015-08-20 19:52:30 +00:00
}
2018-03-22 16:53:24 +00:00
if d . HasChange ( "security_policy" ) {
pol , err := ParseSecurityPolicyFieldValue ( d . Get ( "security_policy" ) . ( string ) , d , config )
if err != nil {
return err
}
op , err := config . clientComputeBeta . BackendServices . SetSecurityPolicy (
project , service . Name , & computeBeta . SecurityPolicyReference {
SecurityPolicy : pol . RelativeLink ( ) ,
} ) . Do ( )
if err != nil {
return err
}
waitErr := computeSharedOperationWait ( config . clientCompute , op , project , "Adding Backend Service Security Policy" )
if waitErr != nil {
return waitErr
}
}
2015-08-20 19:52:30 +00:00
return resourceComputeBackendServiceRead ( d , meta )
}
func resourceComputeBackendServiceDelete ( d * schema . ResourceData , meta interface { } ) error {
config := meta . ( * Config )
2016-04-10 16:59:57 +00:00
project , err := getProject ( d , config )
if err != nil {
return err
}
2015-08-20 19:52:30 +00:00
log . Printf ( "[DEBUG] Deleting backend service %s" , d . Id ( ) )
op , err := config . clientCompute . BackendServices . Delete (
2016-04-10 16:59:57 +00:00
project , d . Id ( ) ) . Do ( )
2015-08-20 19:52:30 +00:00
if err != nil {
return fmt . Errorf ( "Error deleting backend service: %s" , err )
}
2017-10-13 22:36:03 +00:00
err = computeOperationWait ( config . clientCompute , op , project , "Deleting Backend Service" )
2015-08-20 19:52:30 +00:00
if err != nil {
2015-09-24 20:30:12 +00:00
return err
2015-08-20 19:52:30 +00:00
}
d . SetId ( "" )
return nil
}
2018-05-29 20:29:40 +00:00
func expandIap ( configured [ ] interface { } ) * computeBeta . BackendServiceIAP {
2018-10-11 16:37:31 +00:00
if len ( configured ) == 0 || configured [ 0 ] == nil {
2018-03-20 22:41:58 +00:00
return nil
}
2017-10-31 23:27:03 +00:00
2018-10-11 16:37:31 +00:00
data := configured [ 0 ] . ( map [ string ] interface { } )
return & computeBeta . BackendServiceIAP {
Enabled : true ,
Oauth2ClientId : data [ "oauth2_client_id" ] . ( string ) ,
Oauth2ClientSecret : data [ "oauth2_client_secret" ] . ( string ) ,
ForceSendFields : [ ] string { "Enabled" , "Oauth2ClientId" , "Oauth2ClientSecret" } ,
}
2017-10-31 23:27:03 +00:00
}
2018-03-22 16:53:24 +00:00
func flattenIap ( iap * computeBeta . BackendServiceIAP ) [ ] map [ string ] interface { } {
2018-01-02 20:47:28 +00:00
result := make ( [ ] map [ string ] interface { } , 0 , 1 )
if iap == nil || ! iap . Enabled {
return result
2017-10-31 23:27:03 +00:00
}
2018-01-02 20:47:28 +00:00
result = append ( result , map [ string ] interface { } {
2017-10-31 23:27:03 +00:00
"oauth2_client_id" : iap . Oauth2ClientId ,
"oauth2_client_secret" : iap . Oauth2ClientSecretSha256 ,
2018-01-02 20:47:28 +00:00
} )
return result
2017-10-31 23:27:03 +00:00
}
2018-05-29 20:29:40 +00:00
func expandBackends ( configured [ ] interface { } ) ( [ ] * computeBeta . Backend , error ) {
backends := make ( [ ] * computeBeta . Backend , 0 , len ( configured ) )
2015-08-20 19:52:30 +00:00
for _ , raw := range configured {
data := raw . ( map [ string ] interface { } )
2017-10-12 16:21:35 +00:00
g , ok := data [ "group" ]
if ! ok {
return nil , errors . New ( "google_compute_backend_service.backend.group must be set" )
}
2018-05-29 20:29:40 +00:00
b := computeBeta . Backend {
2017-10-12 16:21:35 +00:00
Group : g . ( string ) ,
2015-08-20 19:52:30 +00:00
}
if v , ok := data [ "balancing_mode" ] ; ok {
b . BalancingMode = v . ( string )
}
if v , ok := data [ "capacity_scaler" ] ; ok {
b . CapacityScaler = v . ( float64 )
2018-01-31 01:01:46 +00:00
b . ForceSendFields = append ( b . ForceSendFields , "CapacityScaler" )
2015-08-20 19:52:30 +00:00
}
if v , ok := data [ "description" ] ; ok {
b . Description = v . ( string )
}
if v , ok := data [ "max_rate" ] ; ok {
b . MaxRate = int64 ( v . ( int ) )
2018-02-05 20:58:11 +00:00
if b . MaxRate == 0 {
b . NullFields = append ( b . NullFields , "MaxRate" )
}
2015-08-20 19:52:30 +00:00
}
if v , ok := data [ "max_rate_per_instance" ] ; ok {
b . MaxRatePerInstance = v . ( float64 )
2018-02-05 20:58:11 +00:00
if b . MaxRatePerInstance == 0 {
b . NullFields = append ( b . NullFields , "MaxRatePerInstance" )
}
2015-08-20 19:52:30 +00:00
}
2018-04-19 21:00:34 +00:00
if v , ok := data [ "max_connections" ] ; ok {
b . MaxConnections = int64 ( v . ( int ) )
if b . MaxConnections == 0 {
b . NullFields = append ( b . NullFields , "MaxConnections" )
}
}
if v , ok := data [ "max_connections_per_instance" ] ; ok {
b . MaxConnectionsPerInstance = int64 ( v . ( int ) )
if b . MaxConnectionsPerInstance == 0 {
b . NullFields = append ( b . NullFields , "MaxConnectionsPerInstance" )
}
}
2016-02-04 03:06:32 +00:00
if v , ok := data [ "max_utilization" ] ; ok {
2015-08-20 19:52:30 +00:00
b . MaxUtilization = v . ( float64 )
2018-01-31 01:01:46 +00:00
b . ForceSendFields = append ( b . ForceSendFields , "MaxUtilization" )
2015-08-20 19:52:30 +00:00
}
backends = append ( backends , & b )
}
2017-10-12 16:21:35 +00:00
return backends , nil
2015-08-20 19:52:30 +00:00
}
2018-03-22 16:53:24 +00:00
func flattenBackends ( backends [ ] * computeBeta . Backend ) [ ] map [ string ] interface { } {
2018-03-19 19:08:58 +00:00
result := make ( [ ] map [ string ] interface { } , 0 , len ( backends ) )
2015-08-20 19:52:30 +00:00
for _ , b := range backends {
data := make ( map [ string ] interface { } )
data [ "balancing_mode" ] = b . BalancingMode
data [ "capacity_scaler" ] = b . CapacityScaler
data [ "description" ] = b . Description
data [ "group" ] = b . Group
data [ "max_rate" ] = b . MaxRate
data [ "max_rate_per_instance" ] = b . MaxRatePerInstance
2018-04-19 21:00:34 +00:00
data [ "max_connections" ] = b . MaxConnections
data [ "max_connections_per_instance" ] = b . MaxConnectionsPerInstance
2015-08-20 19:52:30 +00:00
data [ "max_utilization" ] = b . MaxUtilization
result = append ( result , data )
}
2018-03-19 19:08:58 +00:00
return result
2015-08-20 19:52:30 +00:00
}
2018-05-29 20:29:40 +00:00
func expandBackendService ( d * schema . ResourceData ) ( * computeBeta . BackendService , error ) {
2017-09-07 19:56:53 +00:00
hc := d . Get ( "health_checks" ) . ( * schema . Set ) . List ( )
healthChecks := make ( [ ] string , 0 , len ( hc ) )
for _ , v := range hc {
healthChecks = append ( healthChecks , v . ( string ) )
}
2017-10-31 23:27:03 +00:00
// The IAP service is enabled and disabled by adding or removing
// the IAP configuration block (and providing the client id
// and secret). We are force sending the three required API fields
// to enable/disable IAP at all times here, and relying on Golang's
2018-01-02 20:47:28 +00:00
// type defaults to enable or disable IAP in the existence or absence
2017-10-31 23:27:03 +00:00
// of the block, instead of checking if the block exists, zeroing out
// fields, etc.
2018-05-29 20:29:40 +00:00
service := & computeBeta . BackendService {
2017-09-07 19:56:53 +00:00
Name : d . Get ( "name" ) . ( string ) ,
HealthChecks : healthChecks ,
2018-05-29 20:29:40 +00:00
Iap : & computeBeta . BackendServiceIAP {
2017-10-31 23:27:03 +00:00
ForceSendFields : [ ] string { "Enabled" , "Oauth2ClientId" , "Oauth2ClientSecret" } ,
} ,
2018-05-29 20:29:40 +00:00
CdnPolicy : & computeBeta . BackendServiceCdnPolicy {
CacheKeyPolicy : & computeBeta . CacheKeyPolicy {
2018-03-16 17:50:32 +00:00
ForceSendFields : [ ] string { "IncludeProtocol" , "IncludeHost" , "IncludeQueryString" , "QueryStringWhitelist" , "QueryStringBlacklist" } ,
} ,
} ,
2017-10-31 23:27:03 +00:00
}
if v , ok := d . GetOk ( "iap" ) ; ok {
service . Iap = expandIap ( v . ( [ ] interface { } ) )
2017-09-07 19:56:53 +00:00
}
2017-10-12 16:21:35 +00:00
var err error
2017-09-07 19:56:53 +00:00
if v , ok := d . GetOk ( "backend" ) ; ok {
2017-10-12 16:21:35 +00:00
service . Backends , err = expandBackends ( v . ( * schema . Set ) . List ( ) )
if err != nil {
return nil , err
}
2017-09-07 19:56:53 +00:00
}
if v , ok := d . GetOk ( "description" ) ; ok {
service . Description = v . ( string )
}
if v , ok := d . GetOk ( "port_name" ) ; ok {
service . PortName = v . ( string )
}
if v , ok := d . GetOk ( "protocol" ) ; ok {
service . Protocol = v . ( string )
}
if v , ok := d . GetOk ( "session_affinity" ) ; ok {
service . SessionAffinity = v . ( string )
}
if v , ok := d . GetOk ( "timeout_sec" ) ; ok {
service . TimeoutSec = int64 ( v . ( int ) )
}
if v , ok := d . GetOk ( "enable_cdn" ) ; ok {
service . EnableCDN = v . ( bool )
}
connectionDrainingTimeoutSec := d . Get ( "connection_draining_timeout_sec" )
2018-05-29 20:29:40 +00:00
connectionDraining := & computeBeta . ConnectionDraining {
2017-09-07 19:56:53 +00:00
DrainingTimeoutSec : int64 ( connectionDrainingTimeoutSec . ( int ) ) ,
}
service . ConnectionDraining = connectionDraining
2018-03-16 17:50:32 +00:00
if v , ok := d . GetOk ( "cdn_policy" ) ; ok {
c := expandCdnPolicy ( v . ( [ ] interface { } ) )
if c != nil {
service . CdnPolicy = c
}
}
2017-10-12 16:21:35 +00:00
return service , nil
2017-09-07 19:56:53 +00:00
}
2018-03-16 17:50:32 +00:00
2018-05-29 20:29:40 +00:00
func expandCdnPolicy ( configured [ ] interface { } ) * computeBeta . BackendServiceCdnPolicy {
2018-10-11 16:37:31 +00:00
if len ( configured ) == 0 || configured [ 0 ] == nil {
2018-03-16 17:50:32 +00:00
return nil
}
2018-10-11 16:37:31 +00:00
data := configured [ 0 ] . ( map [ string ] interface { } )
2018-03-16 17:50:32 +00:00
ckp := data [ "cache_key_policy" ] . ( [ ] interface { } )
if len ( ckp ) == 0 {
return nil
}
ckpData := ckp [ 0 ] . ( map [ string ] interface { } )
2018-05-29 20:29:40 +00:00
return & computeBeta . BackendServiceCdnPolicy {
CacheKeyPolicy : & computeBeta . CacheKeyPolicy {
2018-03-16 17:50:32 +00:00
IncludeHost : ckpData [ "include_host" ] . ( bool ) ,
IncludeProtocol : ckpData [ "include_protocol" ] . ( bool ) ,
IncludeQueryString : ckpData [ "include_query_string" ] . ( bool ) ,
QueryStringBlacklist : convertStringSet ( ckpData [ "query_string_blacklist" ] . ( * schema . Set ) ) ,
QueryStringWhitelist : convertStringSet ( ckpData [ "query_string_whitelist" ] . ( * schema . Set ) ) ,
ForceSendFields : [ ] string { "IncludeProtocol" , "IncludeHost" , "IncludeQueryString" , "QueryStringWhitelist" , "QueryStringBlacklist" } ,
} ,
}
}
2018-03-22 16:53:24 +00:00
func flattenCdnPolicy ( pol * computeBeta . BackendServiceCdnPolicy ) [ ] map [ string ] interface { } {
2018-03-16 17:50:32 +00:00
result := [ ] map [ string ] interface { } { }
if pol == nil || pol . CacheKeyPolicy == nil {
return result
}
return append ( result , map [ string ] interface { } {
"cache_key_policy" : [ ] map [ string ] interface { } {
{
"include_host" : pol . CacheKeyPolicy . IncludeHost ,
"include_protocol" : pol . CacheKeyPolicy . IncludeProtocol ,
"include_query_string" : pol . CacheKeyPolicy . IncludeQueryString ,
"query_string_blacklist" : schema . NewSet ( schema . HashString , convertStringArrToInterface ( pol . CacheKeyPolicy . QueryStringBlacklist ) ) ,
"query_string_whitelist" : schema . NewSet ( schema . HashString , convertStringArrToInterface ( pol . CacheKeyPolicy . QueryStringWhitelist ) ) ,
} ,
} ,
} )
}