github.com/joshgarnett/terraform@v0.5.4-0.20160219181435-92dc20bb3594/builtin/providers/google/resource_compute_subnetwork.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  	"strings"
    11  )
    12  
    13  func resourceComputeSubnetwork() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceComputeSubnetworkCreate,
    16  		Read:   resourceComputeSubnetworkRead,
    17  		Delete: resourceComputeSubnetworkDelete,
    18  
    19  		Schema: map[string]*schema.Schema{
    20  			"name": &schema.Schema{
    21  				Type:     schema.TypeString,
    22  				Required: true,
    23  				ForceNew: true,
    24  			},
    25  
    26  			"region": &schema.Schema{
    27  				Type:     schema.TypeString,
    28  				Required: true,
    29  				ForceNew: true,
    30  			},
    31  
    32  			"network": &schema.Schema{
    33  				Type:     schema.TypeString,
    34  				Required: true,
    35  				ForceNew: true,
    36  			},
    37  
    38  			"ip_cidr_range": &schema.Schema{
    39  				Type:     schema.TypeString,
    40  				Required: true,
    41  				ForceNew: true,
    42  			},
    43  
    44  			"description": &schema.Schema{
    45  				Type:     schema.TypeString,
    46  				Optional: true,
    47  				ForceNew: true,
    48  			},
    49  
    50  			"gateway_address": &schema.Schema{
    51  				Type:     schema.TypeString,
    52  				Computed: true,
    53  			},
    54  
    55  			"self_link": &schema.Schema{
    56  				Type:     schema.TypeString,
    57  				Computed: true,
    58  			},
    59  		},
    60  	}
    61  }
    62  
    63  func createSubnetID(s *compute.Subnetwork) string {
    64  	return fmt.Sprintf("%s/%s", s.Region, s.Name)
    65  }
    66  
    67  func splitSubnetID(id string) (region string, name string) {
    68  	parts := strings.Split(id, "/")
    69  	region = parts[0]
    70  	name = parts[1]
    71  	return
    72  }
    73  
    74  func resourceComputeSubnetworkCreate(d *schema.ResourceData, meta interface{}) error {
    75  	config := meta.(*Config)
    76  
    77  	// Build the subnetwork parameters
    78  	subnetwork := &compute.Subnetwork{
    79  		Name:        d.Get("name").(string),
    80  		Description: d.Get("description").(string),
    81  		IpCidrRange: d.Get("ip_cidr_range").(string),
    82  		Network:     d.Get("network").(string),
    83  	}
    84  	region := d.Get("region").(string)
    85  
    86  	log.Printf("[DEBUG] Subnetwork insert request: %#v", subnetwork)
    87  	op, err := config.clientCompute.Subnetworks.Insert(
    88  		config.Project, region, subnetwork).Do()
    89  
    90  	if err != nil {
    91  		return fmt.Errorf("Error creating subnetwork: %s", err)
    92  	}
    93  
    94  	// It probably maybe worked, so store the ID now. ID is a combination of region + subnetwork
    95  	// name because subnetwork names are not unique in a project, per the Google docs:
    96  	// "When creating a new subnetwork, its name has to be unique in that project for that region, even across networks.
    97  	// The same name can appear twice in a project, as long as each one is in a different region."
    98  	// https://cloud.google.com/compute/docs/subnetworks
    99  	subnetwork.Region = region
   100  	d.SetId(createSubnetID(subnetwork))
   101  
   102  	err = computeOperationWaitRegion(config, op, region, "Creating Subnetwork")
   103  	if err != nil {
   104  		return err
   105  	}
   106  
   107  	return resourceComputeSubnetworkRead(d, meta)
   108  }
   109  
   110  func resourceComputeSubnetworkRead(d *schema.ResourceData, meta interface{}) error {
   111  	config := meta.(*Config)
   112  	name := d.Get("name").(string)
   113  	region := d.Get("region").(string)
   114  
   115  	subnetwork, err := config.clientCompute.Subnetworks.Get(
   116  		config.Project, region, name).Do()
   117  	if err != nil {
   118  		if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
   119  			log.Printf("[WARN] Removing Subnetwork %q because it's gone", name)
   120  			// The resource doesn't exist anymore
   121  			d.SetId("")
   122  
   123  			return nil
   124  		}
   125  
   126  		return fmt.Errorf("Error reading subnetwork: %s", err)
   127  	}
   128  
   129  	d.Set("gateway_address", subnetwork.GatewayAddress)
   130  	d.Set("self_link", subnetwork.SelfLink)
   131  
   132  	return nil
   133  }
   134  
   135  func resourceComputeSubnetworkDelete(d *schema.ResourceData, meta interface{}) error {
   136  	config := meta.(*Config)
   137  	region := d.Get("region").(string)
   138  
   139  	// Delete the subnetwork
   140  	op, err := config.clientCompute.Subnetworks.Delete(
   141  		config.Project, region, d.Get("name").(string)).Do()
   142  	if err != nil {
   143  		return fmt.Errorf("Error deleting subnetwork: %s", err)
   144  	}
   145  
   146  	err = computeOperationWaitRegion(config, op, region, "Deleting Subnetwork")
   147  	if err != nil {
   148  		return err
   149  	}
   150  
   151  	d.SetId("")
   152  	return nil
   153  }