github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/google/resource_compute_global_forwarding_rule.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  	"google.golang.org/api/compute/v1"
     9  	"google.golang.org/api/googleapi"
    10  )
    11  
    12  func resourceComputeGlobalForwardingRule() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceComputeGlobalForwardingRuleCreate,
    15  		Read:   resourceComputeGlobalForwardingRuleRead,
    16  		Update: resourceComputeGlobalForwardingRuleUpdate,
    17  		Delete: resourceComputeGlobalForwardingRuleDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"name": &schema.Schema{
    21  				Type:     schema.TypeString,
    22  				Required: true,
    23  				ForceNew: true,
    24  			},
    25  
    26  			"target": &schema.Schema{
    27  				Type:     schema.TypeString,
    28  				Required: true,
    29  			},
    30  
    31  			"description": &schema.Schema{
    32  				Type:     schema.TypeString,
    33  				Optional: true,
    34  				ForceNew: true,
    35  			},
    36  
    37  			"ip_address": &schema.Schema{
    38  				Type:     schema.TypeString,
    39  				Optional: true,
    40  				ForceNew: true,
    41  				Computed: true,
    42  			},
    43  
    44  			"ip_protocol": &schema.Schema{
    45  				Type:     schema.TypeString,
    46  				Optional: true,
    47  				ForceNew: true,
    48  				Computed: true,
    49  			},
    50  
    51  			"port_range": &schema.Schema{
    52  				Type:     schema.TypeString,
    53  				Optional: true,
    54  				ForceNew: true,
    55  			},
    56  
    57  			"project": &schema.Schema{
    58  				Type:     schema.TypeString,
    59  				Optional: true,
    60  				ForceNew: true,
    61  			},
    62  
    63  			"region": &schema.Schema{
    64  				Type:       schema.TypeString,
    65  				Optional:   true,
    66  				ForceNew:   true,
    67  				Deprecated: "Please remove this attribute (it was never used)",
    68  			},
    69  
    70  			"self_link": &schema.Schema{
    71  				Type:     schema.TypeString,
    72  				Computed: true,
    73  			},
    74  		},
    75  	}
    76  }
    77  
    78  func resourceComputeGlobalForwardingRuleCreate(d *schema.ResourceData, meta interface{}) error {
    79  	config := meta.(*Config)
    80  
    81  	project, err := getProject(d, config)
    82  	if err != nil {
    83  		return err
    84  	}
    85  
    86  	frule := &compute.ForwardingRule{
    87  		IPAddress:   d.Get("ip_address").(string),
    88  		IPProtocol:  d.Get("ip_protocol").(string),
    89  		Description: d.Get("description").(string),
    90  		Name:        d.Get("name").(string),
    91  		PortRange:   d.Get("port_range").(string),
    92  		Target:      d.Get("target").(string),
    93  	}
    94  
    95  	op, err := config.clientCompute.GlobalForwardingRules.Insert(
    96  		project, frule).Do()
    97  	if err != nil {
    98  		return fmt.Errorf("Error creating Global Forwarding Rule: %s", err)
    99  	}
   100  
   101  	// It probably maybe worked, so store the ID now
   102  	d.SetId(frule.Name)
   103  
   104  	err = computeOperationWaitGlobal(config, op, project, "Creating Global Fowarding Rule")
   105  	if err != nil {
   106  		return err
   107  	}
   108  
   109  	return resourceComputeGlobalForwardingRuleRead(d, meta)
   110  }
   111  
   112  func resourceComputeGlobalForwardingRuleUpdate(d *schema.ResourceData, meta interface{}) error {
   113  	config := meta.(*Config)
   114  
   115  	project, err := getProject(d, config)
   116  	if err != nil {
   117  		return err
   118  	}
   119  
   120  	d.Partial(true)
   121  
   122  	if d.HasChange("target") {
   123  		target_name := d.Get("target").(string)
   124  		target_ref := &compute.TargetReference{Target: target_name}
   125  		op, err := config.clientCompute.GlobalForwardingRules.SetTarget(
   126  			project, d.Id(), target_ref).Do()
   127  		if err != nil {
   128  			return fmt.Errorf("Error updating target: %s", err)
   129  		}
   130  
   131  		err = computeOperationWaitGlobal(config, op, project, "Updating Global Forwarding Rule")
   132  		if err != nil {
   133  			return err
   134  		}
   135  
   136  		d.SetPartial("target")
   137  	}
   138  
   139  	d.Partial(false)
   140  
   141  	return resourceComputeGlobalForwardingRuleRead(d, meta)
   142  }
   143  
   144  func resourceComputeGlobalForwardingRuleRead(d *schema.ResourceData, meta interface{}) error {
   145  	config := meta.(*Config)
   146  
   147  	project, err := getProject(d, config)
   148  	if err != nil {
   149  		return err
   150  	}
   151  
   152  	frule, err := config.clientCompute.GlobalForwardingRules.Get(
   153  		project, d.Id()).Do()
   154  	if err != nil {
   155  		if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
   156  			log.Printf("[WARN] Removing Global Forwarding Rule %q because it's gone", d.Get("name").(string))
   157  			// The resource doesn't exist anymore
   158  			d.SetId("")
   159  
   160  			return nil
   161  		}
   162  
   163  		return fmt.Errorf("Error reading GlobalForwardingRule: %s", err)
   164  	}
   165  
   166  	d.Set("ip_address", frule.IPAddress)
   167  	d.Set("ip_protocol", frule.IPProtocol)
   168  	d.Set("self_link", frule.SelfLink)
   169  
   170  	return nil
   171  }
   172  
   173  func resourceComputeGlobalForwardingRuleDelete(d *schema.ResourceData, meta interface{}) error {
   174  	config := meta.(*Config)
   175  
   176  	project, err := getProject(d, config)
   177  	if err != nil {
   178  		return err
   179  	}
   180  
   181  	// Delete the GlobalForwardingRule
   182  	log.Printf("[DEBUG] GlobalForwardingRule delete request")
   183  	op, err := config.clientCompute.GlobalForwardingRules.Delete(
   184  		project, d.Id()).Do()
   185  	if err != nil {
   186  		return fmt.Errorf("Error deleting GlobalForwardingRule: %s", err)
   187  	}
   188  
   189  	err = computeOperationWaitGlobal(config, op, project, "Deleting GlobalForwarding Rule")
   190  	if err != nil {
   191  		return err
   192  	}
   193  
   194  	d.SetId("")
   195  	return nil
   196  }