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 }