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"
2018-10-24 22:04:58 +00:00
2017-08-04 17:15:51 +00:00
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-11-02 23:06:05 +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 . TypeMap ,
Optional : true ,
Elem : & schema . Schema { Type : schema . TypeString } ,
Set : schema . HashString ,
2017-09-12 15:06:40 +00:00
} ,
"label_fingerprint" : & schema . Schema {
2018-11-02 23:06:05 +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." ,
2017-09-12 15:06:40 +00:00
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
}
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" )
}
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 ) )
2018-11-02 23:06:05 +00:00
// removed lists need something set
d . Set ( "labels" , nil )
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
}