2015-10-30 20:34:14 +00:00
package google
import (
"fmt"
"log"
"github.com/hashicorp/terraform/helper/schema"
2017-08-04 17:15:51 +00:00
"github.com/hashicorp/terraform/helper/validation"
computeBeta "google.golang.org/api/compute/v0.beta"
2018-05-09 18:24:40 +00:00
compute "google.golang.org/api/compute/v1"
2015-10-30 20:34:14 +00:00
)
func resourceComputeGlobalForwardingRule ( ) * schema . Resource {
return & schema . Resource {
Create : resourceComputeGlobalForwardingRuleCreate ,
Read : resourceComputeGlobalForwardingRuleRead ,
Update : resourceComputeGlobalForwardingRuleUpdate ,
Delete : resourceComputeGlobalForwardingRuleDelete ,
2017-10-31 18:28:55 +00:00
Importer : & schema . ResourceImporter {
State : schema . ImportStatePassthrough ,
} ,
2015-10-30 20:34:14 +00:00
Schema : map [ string ] * schema . Schema {
2016-04-10 21:34:15 +00:00
"name" : & schema . Schema {
2015-10-30 20:34:14 +00:00
Type : schema . TypeString ,
2016-04-10 21:34:15 +00:00
Required : true ,
2015-10-30 20:34:14 +00:00
ForceNew : true ,
} ,
2016-04-10 21:34:15 +00:00
"target" : & schema . Schema {
2017-08-04 17:15:51 +00:00
Type : schema . TypeString ,
Required : true ,
DiffSuppressFunc : compareSelfLinkRelativePaths ,
2015-10-30 20:34:14 +00:00
} ,
"description" : & schema . Schema {
Type : schema . TypeString ,
Optional : true ,
ForceNew : true ,
} ,
2016-04-10 21:34:15 +00:00
"ip_address" : & schema . Schema {
2015-10-30 20:34:14 +00:00
Type : schema . TypeString ,
2016-04-10 21:34:15 +00:00
Optional : true ,
2015-10-30 20:34:14 +00:00
ForceNew : true ,
2016-04-10 21:34:15 +00:00
Computed : true ,
2015-10-30 20:34:14 +00:00
} ,
2016-04-10 21:34:15 +00:00
"ip_protocol" : & schema . Schema {
2015-10-30 20:34:14 +00:00
Type : schema . TypeString ,
Optional : true ,
ForceNew : true ,
2016-04-10 21:34:15 +00:00
Computed : true ,
2015-10-30 20:34:14 +00:00
} ,
2017-09-12 15:06:40 +00:00
"labels" : & schema . Schema {
2018-10-03 19:58:52 +00:00
Deprecated : "This field is in beta and will be removed from this provider. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider-versions.html for more details." ,
2018-10-02 21:13:04 +00:00
Type : schema . TypeMap ,
Optional : true ,
Elem : & schema . Schema { Type : schema . TypeString } ,
Set : schema . HashString ,
2017-09-12 15:06:40 +00:00
} ,
"label_fingerprint" : & schema . Schema {
Type : schema . TypeString ,
Computed : true ,
} ,
2016-04-10 21:34:15 +00:00
"port_range" : & schema . Schema {
2017-10-31 18:28:55 +00:00
Type : schema . TypeString ,
Optional : true ,
ForceNew : true ,
DiffSuppressFunc : portRangeDiffSuppress ,
2015-10-30 20:34:14 +00:00
} ,
2017-08-04 17:15:51 +00:00
"ip_version" : & schema . Schema {
Type : schema . TypeString ,
Optional : true ,
ForceNew : true ,
ValidateFunc : validation . StringInSlice ( [ ] string { "IPV4" , "IPV6" } , false ) ,
} ,
2016-04-10 21:34:15 +00:00
"project" : & schema . Schema {
2015-10-30 20:34:14 +00:00
Type : schema . TypeString ,
2016-04-10 21:34:15 +00:00
Optional : true ,
2017-11-28 00:32:20 +00:00
Computed : true ,
2016-04-10 21:34:15 +00:00
ForceNew : true ,
2015-10-30 20:34:14 +00:00
} ,
2016-04-10 16:22:44 +00:00
"region" : & schema . Schema {
2017-09-28 21:38:38 +00:00
Type : schema . TypeString ,
Optional : true ,
ForceNew : true ,
Removed : "Please remove this attribute (it was never used)" ,
2016-04-10 16:22:44 +00:00
} ,
2016-04-10 16:59:57 +00:00
2016-04-10 21:34:15 +00:00
"self_link" : & schema . Schema {
2016-04-10 16:59:57 +00:00
Type : schema . TypeString ,
2016-04-10 21:34:15 +00:00
Computed : true ,
2016-04-10 16:59:57 +00:00
} ,
2015-10-30 20:34:14 +00:00
} ,
}
}
func resourceComputeGlobalForwardingRuleCreate ( 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
}
2017-08-04 17:15:51 +00:00
frule := & computeBeta . ForwardingRule {
2015-10-30 20:34:14 +00:00
IPAddress : d . Get ( "ip_address" ) . ( string ) ,
IPProtocol : d . Get ( "ip_protocol" ) . ( string ) ,
2017-08-04 17:15:51 +00:00
IpVersion : d . Get ( "ip_version" ) . ( string ) ,
2015-10-30 20:34:14 +00:00
Description : d . Get ( "description" ) . ( string ) ,
Name : d . Get ( "name" ) . ( string ) ,
PortRange : d . Get ( "port_range" ) . ( string ) ,
Target : d . Get ( "target" ) . ( string ) ,
}
2018-05-09 18:24:40 +00:00
op , err := config . clientComputeBeta . GlobalForwardingRules . Insert ( project , frule ) . Do ( )
if err != nil {
return fmt . Errorf ( "Error creating Global Forwarding Rule: %s" , err )
2015-10-30 20:34:14 +00:00
}
// It probably maybe worked, so store the ID now
d . SetId ( frule . Name )
2017-10-13 22:36:03 +00:00
err = computeSharedOperationWait ( config . clientCompute , op , project , "Creating Global Fowarding Rule" )
2015-10-30 20:34:14 +00:00
if err != nil {
return err
}
2017-09-12 15:06:40 +00:00
// If we have labels to set, try to set those too
if _ , ok := d . GetOk ( "labels" ) ; ok {
labels := expandLabels ( d )
// Do a read to get the fingerprint value so we can update
2018-05-09 18:24:40 +00:00
fingerprint , err := resourceComputeGlobalForwardingRuleReadLabelFingerprint ( config , project , frule . Name )
2017-09-12 15:06:40 +00:00
if err != nil {
return err
}
2018-05-09 18:24:40 +00:00
err = resourceComputeGlobalForwardingRuleSetLabels ( config , project , frule . Name , labels , fingerprint )
2017-09-12 15:06:40 +00:00
if err != nil {
return err
}
}
2015-10-30 20:34:14 +00:00
return resourceComputeGlobalForwardingRuleRead ( d , meta )
}
func resourceComputeGlobalForwardingRuleUpdate ( 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-10-30 20:34:14 +00:00
d . Partial ( true )
if d . HasChange ( "target" ) {
2017-08-04 17:15:51 +00:00
target := d . Get ( "target" ) . ( string )
2018-05-09 18:24:40 +00:00
targetRef := & compute . TargetReference { Target : target }
op , err := config . clientCompute . GlobalForwardingRules . SetTarget (
project , d . Id ( ) , targetRef ) . Do ( )
if err != nil {
return fmt . Errorf ( "Error updating target: %s" , err )
2015-10-30 20:34:14 +00:00
}
2017-10-13 22:36:03 +00:00
err = computeSharedOperationWait ( config . clientCompute , op , project , "Updating Global Forwarding Rule" )
2015-10-30 20:34:14 +00:00
if err != nil {
return err
}
d . SetPartial ( "target" )
}
2017-09-12 15:06:40 +00:00
if d . HasChange ( "labels" ) {
labels := expandLabels ( d )
fingerprint := d . Get ( "label_fingerprint" ) . ( string )
2018-05-09 18:24:40 +00:00
err = resourceComputeGlobalForwardingRuleSetLabels ( config , project , d . Get ( "name" ) . ( string ) , labels , fingerprint )
2017-09-12 15:06:40 +00:00
if err != nil {
return err
}
d . SetPartial ( "labels" )
}
2015-10-30 20:34:14 +00:00
d . Partial ( false )
return resourceComputeGlobalForwardingRuleRead ( d , meta )
}
func resourceComputeGlobalForwardingRuleRead ( 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
frule , err := config . clientComputeBeta . GlobalForwardingRules . Get ( project , d . Id ( ) ) . Do ( )
if err != nil {
return handleNotFoundError ( err , d , fmt . Sprintf ( "Global Forwarding Rule %q" , d . Get ( "name" ) . ( string ) ) )
2015-10-30 20:34:14 +00:00
}
2017-10-31 18:28:55 +00:00
d . Set ( "name" , frule . Name )
d . Set ( "description" , frule . Description )
d . Set ( "target" , frule . Target )
d . Set ( "port_range" , frule . PortRange )
2015-10-30 20:34:14 +00:00
d . Set ( "ip_address" , frule . IPAddress )
d . Set ( "ip_protocol" , frule . IPProtocol )
2017-08-04 17:15:51 +00:00
d . Set ( "ip_version" , frule . IpVersion )
d . Set ( "self_link" , ConvertSelfLinkToV1 ( frule . SelfLink ) )
2017-09-12 15:06:40 +00:00
d . Set ( "labels" , frule . Labels )
d . Set ( "label_fingerprint" , frule . LabelFingerprint )
2017-11-28 00:32:20 +00:00
d . Set ( "project" , project )
2015-10-30 20:34:14 +00:00
return nil
}
func resourceComputeGlobalForwardingRuleDelete ( 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-10-30 20:34:14 +00:00
// Delete the GlobalForwardingRule
log . Printf ( "[DEBUG] GlobalForwardingRule delete request" )
2018-05-09 18:24:40 +00:00
op , err := config . clientCompute . GlobalForwardingRules . Delete ( project , d . Id ( ) ) . Do ( )
if err != nil {
return fmt . Errorf ( "Error deleting GlobalForwardingRule: %s" , err )
2015-10-30 20:34:14 +00:00
}
2017-10-13 22:36:03 +00:00
err = computeSharedOperationWait ( config . clientCompute , op , project , "Deleting GlobalForwarding Rule" )
2015-10-30 20:34:14 +00:00
if err != nil {
return err
}
d . SetId ( "" )
return nil
}
2017-09-12 15:06:40 +00:00
// resourceComputeGlobalForwardingRuleReadLabelFingerprint performs a read on the remote resource and returns only the
// fingerprint. Used on create when setting labels as we don't know the label fingerprint initially.
2018-05-09 18:24:40 +00:00
func resourceComputeGlobalForwardingRuleReadLabelFingerprint ( config * Config , project , name string ) ( string , error ) {
frule , err := config . clientComputeBeta . GlobalForwardingRules . Get ( project , name ) . Do ( )
if err != nil {
return "" , fmt . Errorf ( "Unable to read global forwarding rule to update labels: %s" , err )
2018-05-04 14:51:45 +00:00
}
2018-05-09 18:24:40 +00:00
return frule . LabelFingerprint , nil
2017-09-12 15:06:40 +00:00
}
// resourceComputeGlobalForwardingRuleSetLabels sets the Labels attribute on a forwarding rule.
2018-05-09 18:24:40 +00:00
func resourceComputeGlobalForwardingRuleSetLabels ( config * Config , project , name string , labels map [ string ] string , fingerprint string ) error {
setLabels := computeBeta . GlobalSetLabelsRequest {
Labels : labels ,
LabelFingerprint : fingerprint ,
}
op , err := config . clientComputeBeta . GlobalForwardingRules . SetLabels ( project , name , & setLabels ) . Do ( )
if err != nil {
return err
2017-09-12 15:06:40 +00:00
}
2017-10-13 22:36:03 +00:00
err = computeSharedOperationWait ( config . clientCompute , op , project , "Setting labels on Global Forwarding Rule" )
2017-09-12 15:06:40 +00:00
if err != nil {
return err
}
return nil
}