github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/google/resource_compute_subnetwork.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"strings"
     8  
     9  	"github.com/hashicorp/terraform/helper/schema"
    10  	"google.golang.org/api/compute/v1"
    11  )
    12  
    13  func resourceComputeSubnetwork() *schema.Resource {
    14  	return &schema.Resource{
    15  		Create: resourceComputeSubnetworkCreate,
    16  		Read:   resourceComputeSubnetworkRead,
    17  		Update: resourceComputeSubnetworkUpdate,
    18  		Delete: resourceComputeSubnetworkDelete,
    19  
    20  		Schema: map[string]*schema.Schema{
    21  			"ip_cidr_range": &schema.Schema{
    22  				Type:     schema.TypeString,
    23  				Required: true,
    24  				ForceNew: true,
    25  			},
    26  
    27  			"name": &schema.Schema{
    28  				Type:     schema.TypeString,
    29  				Required: true,
    30  				ForceNew: true,
    31  			},
    32  
    33  			"network": &schema.Schema{
    34  				Type:     schema.TypeString,
    35  				Required: true,
    36  				ForceNew: true,
    37  			},
    38  
    39  			"description": &schema.Schema{
    40  				Type:     schema.TypeString,
    41  				Optional: true,
    42  				ForceNew: true,
    43  			},
    44  
    45  			"gateway_address": &schema.Schema{
    46  				Type:     schema.TypeString,
    47  				Computed: true,
    48  			},
    49  
    50  			"project": &schema.Schema{
    51  				Type:     schema.TypeString,
    52  				Optional: true,
    53  				ForceNew: true,
    54  			},
    55  
    56  			"region": &schema.Schema{
    57  				Type:     schema.TypeString,
    58  				Optional: true,
    59  				ForceNew: true,
    60  			},
    61  
    62  			"private_ip_google_access": &schema.Schema{
    63  				Type:     schema.TypeBool,
    64  				Optional: true,
    65  			},
    66  
    67  			"self_link": &schema.Schema{
    68  				Type:     schema.TypeString,
    69  				Computed: true,
    70  			},
    71  		},
    72  	}
    73  }
    74  
    75  func createSubnetID(s *compute.Subnetwork) string {
    76  	return fmt.Sprintf("%s/%s", s.Region, s.Name)
    77  }
    78  
    79  func splitSubnetID(id string) (region string, name string) {
    80  	parts := strings.Split(id, "/")
    81  	region = parts[0]
    82  	name = parts[1]
    83  	return
    84  }
    85  
    86  func resourceComputeSubnetworkCreate(d *schema.ResourceData, meta interface{}) error {
    87  	config := meta.(*Config)
    88  
    89  	region, err := getRegion(d, config)
    90  	if err != nil {
    91  		return err
    92  	}
    93  
    94  	project, err := getProject(d, config)
    95  	if err != nil {
    96  		return err
    97  	}
    98  
    99  	network, err := getNetworkLink(d, config, "network")
   100  	if err != nil {
   101  		return err
   102  	}
   103  
   104  	// Build the subnetwork parameters
   105  	subnetwork := &compute.Subnetwork{
   106  		Name:                  d.Get("name").(string),
   107  		Description:           d.Get("description").(string),
   108  		IpCidrRange:           d.Get("ip_cidr_range").(string),
   109  		PrivateIpGoogleAccess: d.Get("private_ip_google_access").(bool),
   110  		Network:               network,
   111  	}
   112  
   113  	log.Printf("[DEBUG] Subnetwork insert request: %#v", subnetwork)
   114  	op, err := config.clientCompute.Subnetworks.Insert(
   115  		project, region, subnetwork).Do()
   116  
   117  	if err != nil {
   118  		return fmt.Errorf("Error creating subnetwork: %s", err)
   119  	}
   120  
   121  	// It probably maybe worked, so store the ID now. ID is a combination of region + subnetwork
   122  	// name because subnetwork names are not unique in a project, per the Google docs:
   123  	// "When creating a new subnetwork, its name has to be unique in that project for that region, even across networks.
   124  	// The same name can appear twice in a project, as long as each one is in a different region."
   125  	// https://cloud.google.com/compute/docs/subnetworks
   126  	subnetwork.Region = region
   127  	d.SetId(createSubnetID(subnetwork))
   128  
   129  	err = computeOperationWaitRegion(config, op, project, region, "Creating Subnetwork")
   130  	if err != nil {
   131  		return err
   132  	}
   133  
   134  	return resourceComputeSubnetworkRead(d, meta)
   135  }
   136  
   137  func resourceComputeSubnetworkRead(d *schema.ResourceData, meta interface{}) error {
   138  	config := meta.(*Config)
   139  
   140  	region, err := getRegion(d, config)
   141  	if err != nil {
   142  		return err
   143  	}
   144  
   145  	project, err := getProject(d, config)
   146  	if err != nil {
   147  		return err
   148  	}
   149  
   150  	name := d.Get("name").(string)
   151  
   152  	subnetwork, err := config.clientCompute.Subnetworks.Get(
   153  		project, region, name).Do()
   154  	if err != nil {
   155  		return handleNotFoundError(err, d, fmt.Sprintf("Subnetwork %q", name))
   156  	}
   157  
   158  	d.Set("gateway_address", subnetwork.GatewayAddress)
   159  	d.Set("self_link", subnetwork.SelfLink)
   160  
   161  	return nil
   162  }
   163  
   164  func resourceComputeSubnetworkUpdate(d *schema.ResourceData, meta interface{}) error {
   165  	config := meta.(*Config)
   166  
   167  	region, err := getRegion(d, config)
   168  	if err != nil {
   169  		return err
   170  	}
   171  
   172  	project, err := getProject(d, config)
   173  	if err != nil {
   174  		return err
   175  	}
   176  
   177  	d.Partial(true)
   178  
   179  	if d.HasChange("private_ip_google_access") {
   180  		subnetworksSetPrivateIpGoogleAccessRequest := &compute.SubnetworksSetPrivateIpGoogleAccessRequest{
   181  			PrivateIpGoogleAccess: d.Get("private_ip_google_access").(bool),
   182  		}
   183  
   184  		log.Printf("[DEBUG] Updating Subnetwork PrivateIpGoogleAccess %q: %#v", d.Id(), subnetworksSetPrivateIpGoogleAccessRequest)
   185  		op, err := config.clientCompute.Subnetworks.SetPrivateIpGoogleAccess(
   186  			project, region, d.Get("name").(string), subnetworksSetPrivateIpGoogleAccessRequest).Do()
   187  		if err != nil {
   188  			return fmt.Errorf("Error updating subnetwork PrivateIpGoogleAccess: %s", err)
   189  		}
   190  
   191  		err = computeOperationWaitRegion(config, op, project, region, "Updating Subnetwork PrivateIpGoogleAccess")
   192  		if err != nil {
   193  			return err
   194  		}
   195  
   196  		d.SetPartial("private_ip_google_access")
   197  	}
   198  
   199  	d.Partial(false)
   200  
   201  	return resourceComputeSubnetworkRead(d, meta)
   202  }
   203  
   204  func resourceComputeSubnetworkDelete(d *schema.ResourceData, meta interface{}) error {
   205  	config := meta.(*Config)
   206  
   207  	region, err := getRegion(d, config)
   208  	if err != nil {
   209  		return err
   210  	}
   211  
   212  	project, err := getProject(d, config)
   213  	if err != nil {
   214  		return err
   215  	}
   216  
   217  	// Delete the subnetwork
   218  	op, err := config.clientCompute.Subnetworks.Delete(
   219  		project, region, d.Get("name").(string)).Do()
   220  	if err != nil {
   221  		return fmt.Errorf("Error deleting subnetwork: %s", err)
   222  	}
   223  
   224  	err = computeOperationWaitRegion(config, op, project, region, "Deleting Subnetwork")
   225  	if err != nil {
   226  		return err
   227  	}
   228  
   229  	d.SetId("")
   230  	return nil
   231  }