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 }