github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/google/resource_compute_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 resourceComputeForwardingRule() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceComputeForwardingRuleCreate,
    15  		Read:   resourceComputeForwardingRuleRead,
    16  		Delete: resourceComputeForwardingRuleDelete,
    17  		Update: resourceComputeForwardingRuleUpdate,
    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  				ForceNew: false,
    30  			},
    31  
    32  			"description": &schema.Schema{
    33  				Type:     schema.TypeString,
    34  				Optional: true,
    35  				ForceNew: true,
    36  			},
    37  
    38  			"ip_address": &schema.Schema{
    39  				Type:     schema.TypeString,
    40  				Optional: true,
    41  				ForceNew: true,
    42  				Computed: true,
    43  			},
    44  
    45  			"ip_protocol": &schema.Schema{
    46  				Type:     schema.TypeString,
    47  				Optional: true,
    48  				ForceNew: true,
    49  				Computed: true,
    50  			},
    51  
    52  			"port_range": &schema.Schema{
    53  				Type:     schema.TypeString,
    54  				Optional: true,
    55  				ForceNew: true,
    56  			},
    57  
    58  			"project": &schema.Schema{
    59  				Type:     schema.TypeString,
    60  				Optional: true,
    61  				ForceNew: true,
    62  			},
    63  
    64  			"region": &schema.Schema{
    65  				Type:     schema.TypeString,
    66  				Optional: true,
    67  				ForceNew: true,
    68  			},
    69  
    70  			"self_link": &schema.Schema{
    71  				Type:     schema.TypeString,
    72  				Computed: true,
    73  			},
    74  		},
    75  	}
    76  }
    77  
    78  func resourceComputeForwardingRuleCreate(d *schema.ResourceData, meta interface{}) error {
    79  	config := meta.(*Config)
    80  
    81  	region, err := getRegion(d, config)
    82  	if err != nil {
    83  		return err
    84  	}
    85  
    86  	project, err := getProject(d, config)
    87  	if err != nil {
    88  		return err
    89  	}
    90  
    91  	frule := &compute.ForwardingRule{
    92  		IPAddress:   d.Get("ip_address").(string),
    93  		IPProtocol:  d.Get("ip_protocol").(string),
    94  		Description: d.Get("description").(string),
    95  		Name:        d.Get("name").(string),
    96  		PortRange:   d.Get("port_range").(string),
    97  		Target:      d.Get("target").(string),
    98  	}
    99  
   100  	log.Printf("[DEBUG] ForwardingRule insert request: %#v", frule)
   101  	op, err := config.clientCompute.ForwardingRules.Insert(
   102  		project, region, frule).Do()
   103  	if err != nil {
   104  		return fmt.Errorf("Error creating ForwardingRule: %s", err)
   105  	}
   106  
   107  	// It probably maybe worked, so store the ID now
   108  	d.SetId(frule.Name)
   109  
   110  	err = computeOperationWaitRegion(config, op, region, "Creating Fowarding Rule")
   111  	if err != nil {
   112  		return err
   113  	}
   114  
   115  	return resourceComputeForwardingRuleRead(d, meta)
   116  }
   117  
   118  func resourceComputeForwardingRuleUpdate(d *schema.ResourceData, meta interface{}) error {
   119  	config := meta.(*Config)
   120  
   121  	region, err := getRegion(d, config)
   122  	if err != nil {
   123  		return err
   124  	}
   125  
   126  	project, err := getProject(d, config)
   127  	if err != nil {
   128  		return err
   129  	}
   130  
   131  	d.Partial(true)
   132  
   133  	if d.HasChange("target") {
   134  		target_name := d.Get("target").(string)
   135  		target_ref := &compute.TargetReference{Target: target_name}
   136  		op, err := config.clientCompute.ForwardingRules.SetTarget(
   137  			project, region, d.Id(), target_ref).Do()
   138  		if err != nil {
   139  			return fmt.Errorf("Error updating target: %s", err)
   140  		}
   141  
   142  		err = computeOperationWaitRegion(config, op, region, "Updating Forwarding Rule")
   143  		if err != nil {
   144  			return err
   145  		}
   146  
   147  		d.SetPartial("target")
   148  	}
   149  
   150  	d.Partial(false)
   151  
   152  	return resourceComputeForwardingRuleRead(d, meta)
   153  }
   154  
   155  func resourceComputeForwardingRuleRead(d *schema.ResourceData, meta interface{}) error {
   156  	config := meta.(*Config)
   157  
   158  	region, err := getRegion(d, config)
   159  	if err != nil {
   160  		return err
   161  	}
   162  
   163  	project, err := getProject(d, config)
   164  	if err != nil {
   165  		return err
   166  	}
   167  
   168  	frule, err := config.clientCompute.ForwardingRules.Get(
   169  		project, region, d.Id()).Do()
   170  	if err != nil {
   171  		if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
   172  			log.Printf("[WARN] Removing Forwarding Rule %q because it's gone", d.Get("name").(string))
   173  			// The resource doesn't exist anymore
   174  			d.SetId("")
   175  
   176  			return nil
   177  		}
   178  
   179  		return fmt.Errorf("Error reading ForwardingRule: %s", err)
   180  	}
   181  
   182  	d.Set("ip_address", frule.IPAddress)
   183  	d.Set("ip_protocol", frule.IPProtocol)
   184  	d.Set("self_link", frule.SelfLink)
   185  
   186  	return nil
   187  }
   188  
   189  func resourceComputeForwardingRuleDelete(d *schema.ResourceData, meta interface{}) error {
   190  	config := meta.(*Config)
   191  
   192  	region, err := getRegion(d, config)
   193  	if err != nil {
   194  		return err
   195  	}
   196  
   197  	project, err := getProject(d, config)
   198  	if err != nil {
   199  		return err
   200  	}
   201  
   202  	// Delete the ForwardingRule
   203  	log.Printf("[DEBUG] ForwardingRule delete request")
   204  	op, err := config.clientCompute.ForwardingRules.Delete(
   205  		project, region, d.Id()).Do()
   206  	if err != nil {
   207  		return fmt.Errorf("Error deleting ForwardingRule: %s", err)
   208  	}
   209  
   210  	err = computeOperationWaitRegion(config, op, region, "Deleting Forwarding Rule")
   211  	if err != nil {
   212  		return err
   213  	}
   214  
   215  	d.SetId("")
   216  	return nil
   217  }