github.com/IBM-Cloud/terraform@v0.6.4-0.20170726051544-8872b87621df/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  )
    10  
    11  func resourceComputeForwardingRule() *schema.Resource {
    12  	return &schema.Resource{
    13  		Create: resourceComputeForwardingRuleCreate,
    14  		Read:   resourceComputeForwardingRuleRead,
    15  		Delete: resourceComputeForwardingRuleDelete,
    16  		Update: resourceComputeForwardingRuleUpdate,
    17  		Importer: &schema.ResourceImporter{
    18  			State: schema.ImportStatePassthrough,
    19  		},
    20  
    21  		Schema: map[string]*schema.Schema{
    22  			"name": &schema.Schema{
    23  				Type:     schema.TypeString,
    24  				Required: true,
    25  				ForceNew: true,
    26  			},
    27  
    28  			"target": &schema.Schema{
    29  				Type:     schema.TypeString,
    30  				Optional: true,
    31  				ForceNew: false,
    32  			},
    33  
    34  			"backend_service": &schema.Schema{
    35  				Type:     schema.TypeString,
    36  				Optional: true,
    37  				ForceNew: true,
    38  			},
    39  
    40  			"description": &schema.Schema{
    41  				Type:     schema.TypeString,
    42  				Optional: true,
    43  				ForceNew: true,
    44  			},
    45  
    46  			"ip_address": &schema.Schema{
    47  				Type:     schema.TypeString,
    48  				Optional: true,
    49  				ForceNew: true,
    50  				Computed: true,
    51  			},
    52  
    53  			"ip_protocol": &schema.Schema{
    54  				Type:     schema.TypeString,
    55  				Optional: true,
    56  				ForceNew: true,
    57  				Computed: true,
    58  			},
    59  
    60  			"load_balancing_scheme": &schema.Schema{
    61  				Type:     schema.TypeString,
    62  				Optional: true,
    63  				ForceNew: true,
    64  				Default:  "EXTERNAL",
    65  			},
    66  
    67  			"network": &schema.Schema{
    68  				Type:     schema.TypeString,
    69  				Optional: true,
    70  				ForceNew: true,
    71  				Computed: true,
    72  			},
    73  
    74  			"port_range": &schema.Schema{
    75  				Type:     schema.TypeString,
    76  				Optional: true,
    77  				ForceNew: true,
    78  				DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
    79  					if old == new+"-"+new {
    80  						return true
    81  					}
    82  					return false
    83  				},
    84  			},
    85  
    86  			"ports": &schema.Schema{
    87  				Type:     schema.TypeSet,
    88  				Elem:     &schema.Schema{Type: schema.TypeString},
    89  				Optional: true,
    90  				ForceNew: true,
    91  				Set:      schema.HashString,
    92  				MaxItems: 5,
    93  			},
    94  
    95  			"project": &schema.Schema{
    96  				Type:     schema.TypeString,
    97  				Optional: true,
    98  				ForceNew: true,
    99  				Computed: true,
   100  			},
   101  
   102  			"region": &schema.Schema{
   103  				Type:     schema.TypeString,
   104  				Optional: true,
   105  				ForceNew: true,
   106  				Computed: true,
   107  			},
   108  
   109  			"self_link": &schema.Schema{
   110  				Type:     schema.TypeString,
   111  				Computed: true,
   112  			},
   113  
   114  			"subnetwork": &schema.Schema{
   115  				Type:     schema.TypeString,
   116  				Optional: true,
   117  				ForceNew: true,
   118  				Computed: true,
   119  			},
   120  		},
   121  	}
   122  }
   123  
   124  func resourceComputeForwardingRuleCreate(d *schema.ResourceData, meta interface{}) error {
   125  	config := meta.(*Config)
   126  
   127  	region, err := getRegion(d, config)
   128  	if err != nil {
   129  		return err
   130  	}
   131  
   132  	project, err := getProject(d, config)
   133  	if err != nil {
   134  		return err
   135  	}
   136  
   137  	ps := d.Get("ports").(*schema.Set).List()
   138  	ports := make([]string, 0, len(ps))
   139  	for _, v := range ps {
   140  		ports = append(ports, v.(string))
   141  	}
   142  
   143  	frule := &compute.ForwardingRule{
   144  		BackendService:      d.Get("backend_service").(string),
   145  		IPAddress:           d.Get("ip_address").(string),
   146  		IPProtocol:          d.Get("ip_protocol").(string),
   147  		Description:         d.Get("description").(string),
   148  		LoadBalancingScheme: d.Get("load_balancing_scheme").(string),
   149  		Name:                d.Get("name").(string),
   150  		Network:             d.Get("network").(string),
   151  		PortRange:           d.Get("port_range").(string),
   152  		Ports:               ports,
   153  		Subnetwork:          d.Get("subnetwork").(string),
   154  		Target:              d.Get("target").(string),
   155  	}
   156  
   157  	log.Printf("[DEBUG] ForwardingRule insert request: %#v", frule)
   158  	op, err := config.clientCompute.ForwardingRules.Insert(
   159  		project, region, frule).Do()
   160  	if err != nil {
   161  		return fmt.Errorf("Error creating ForwardingRule: %s", err)
   162  	}
   163  
   164  	// It probably maybe worked, so store the ID now
   165  	d.SetId(frule.Name)
   166  
   167  	err = computeOperationWaitRegion(config, op, project, region, "Creating Fowarding Rule")
   168  	if err != nil {
   169  		return err
   170  	}
   171  
   172  	return resourceComputeForwardingRuleRead(d, meta)
   173  }
   174  
   175  func resourceComputeForwardingRuleUpdate(d *schema.ResourceData, meta interface{}) error {
   176  	config := meta.(*Config)
   177  
   178  	region, err := getRegion(d, config)
   179  	if err != nil {
   180  		return err
   181  	}
   182  
   183  	project, err := getProject(d, config)
   184  	if err != nil {
   185  		return err
   186  	}
   187  
   188  	d.Partial(true)
   189  
   190  	if d.HasChange("target") {
   191  		target_name := d.Get("target").(string)
   192  		target_ref := &compute.TargetReference{Target: target_name}
   193  		op, err := config.clientCompute.ForwardingRules.SetTarget(
   194  			project, region, d.Id(), target_ref).Do()
   195  		if err != nil {
   196  			return fmt.Errorf("Error updating target: %s", err)
   197  		}
   198  
   199  		err = computeOperationWaitRegion(config, op, project, region, "Updating Forwarding Rule")
   200  		if err != nil {
   201  			return err
   202  		}
   203  
   204  		d.SetPartial("target")
   205  	}
   206  
   207  	d.Partial(false)
   208  
   209  	return resourceComputeForwardingRuleRead(d, meta)
   210  }
   211  
   212  func resourceComputeForwardingRuleRead(d *schema.ResourceData, meta interface{}) error {
   213  	config := meta.(*Config)
   214  
   215  	region, err := getRegion(d, config)
   216  	if err != nil {
   217  		return err
   218  	}
   219  
   220  	project, err := getProject(d, config)
   221  	if err != nil {
   222  		return err
   223  	}
   224  
   225  	frule, err := config.clientCompute.ForwardingRules.Get(
   226  		project, region, d.Id()).Do()
   227  	if err != nil {
   228  		return handleNotFoundError(err, d, fmt.Sprintf("Forwarding Rule %q", d.Get("name").(string)))
   229  	}
   230  
   231  	d.Set("name", frule.Name)
   232  	d.Set("target", frule.Target)
   233  	d.Set("backend_service", frule.BackendService)
   234  	d.Set("description", frule.Description)
   235  	d.Set("load_balancing_scheme", frule.LoadBalancingScheme)
   236  	d.Set("network", frule.Network)
   237  	d.Set("port_range", frule.PortRange)
   238  	d.Set("ports", frule.Ports)
   239  	d.Set("project", project)
   240  	d.Set("region", region)
   241  	d.Set("subnetwork", frule.Subnetwork)
   242  	d.Set("ip_address", frule.IPAddress)
   243  	d.Set("ip_protocol", frule.IPProtocol)
   244  	d.Set("self_link", frule.SelfLink)
   245  	return nil
   246  }
   247  
   248  func resourceComputeForwardingRuleDelete(d *schema.ResourceData, meta interface{}) error {
   249  	config := meta.(*Config)
   250  
   251  	region, err := getRegion(d, config)
   252  	if err != nil {
   253  		return err
   254  	}
   255  
   256  	project, err := getProject(d, config)
   257  	if err != nil {
   258  		return err
   259  	}
   260  
   261  	// Delete the ForwardingRule
   262  	log.Printf("[DEBUG] ForwardingRule delete request")
   263  	op, err := config.clientCompute.ForwardingRules.Delete(
   264  		project, region, d.Id()).Do()
   265  	if err != nil {
   266  		return fmt.Errorf("Error deleting ForwardingRule: %s", err)
   267  	}
   268  
   269  	err = computeOperationWaitRegion(config, op, project, region, "Deleting Forwarding Rule")
   270  	if err != nil {
   271  		return err
   272  	}
   273  
   274  	d.SetId("")
   275  	return nil
   276  }