github.com/ndarilek/terraform@v0.3.8-0.20150320140257-d3135c1b2bac/builtin/providers/google/resource_compute_route.go (about) 1 package google 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 "code.google.com/p/google-api-go-client/compute/v1" 9 "code.google.com/p/google-api-go-client/googleapi" 10 "github.com/hashicorp/terraform/helper/hashcode" 11 "github.com/hashicorp/terraform/helper/schema" 12 ) 13 14 func resourceComputeRoute() *schema.Resource { 15 return &schema.Resource{ 16 Create: resourceComputeRouteCreate, 17 Read: resourceComputeRouteRead, 18 Delete: resourceComputeRouteDelete, 19 20 Schema: map[string]*schema.Schema{ 21 "name": &schema.Schema{ 22 Type: schema.TypeString, 23 Required: true, 24 ForceNew: true, 25 }, 26 27 "dest_range": &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 "next_hop_ip": &schema.Schema{ 40 Type: schema.TypeString, 41 Optional: true, 42 ForceNew: true, 43 }, 44 45 "next_hop_instance": &schema.Schema{ 46 Type: schema.TypeString, 47 Optional: true, 48 ForceNew: true, 49 }, 50 51 "next_hop_instance_zone": &schema.Schema{ 52 Type: schema.TypeString, 53 Optional: true, 54 ForceNew: true, 55 }, 56 57 "next_hop_gateway": &schema.Schema{ 58 Type: schema.TypeString, 59 Optional: true, 60 ForceNew: true, 61 }, 62 63 "next_hop_network": &schema.Schema{ 64 Type: schema.TypeString, 65 Optional: true, 66 ForceNew: true, 67 }, 68 69 "priority": &schema.Schema{ 70 Type: schema.TypeInt, 71 Required: true, 72 ForceNew: true, 73 }, 74 75 "tags": &schema.Schema{ 76 Type: schema.TypeSet, 77 Optional: true, 78 Elem: &schema.Schema{Type: schema.TypeString}, 79 Set: func(v interface{}) int { 80 return hashcode.String(v.(string)) 81 }, 82 }, 83 84 "self_link": &schema.Schema{ 85 Type: schema.TypeString, 86 Computed: true, 87 }, 88 }, 89 } 90 } 91 92 func resourceComputeRouteCreate(d *schema.ResourceData, meta interface{}) error { 93 config := meta.(*Config) 94 95 // Look up the network to attach the route to 96 network, err := config.clientCompute.Networks.Get( 97 config.Project, d.Get("network").(string)).Do() 98 if err != nil { 99 return fmt.Errorf("Error reading network: %s", err) 100 } 101 102 // Next hop data 103 var nextHopInstance, nextHopIp, nextHopNetwork, nextHopGateway string 104 if v, ok := d.GetOk("next_hop_ip"); ok { 105 nextHopIp = v.(string) 106 } 107 if v, ok := d.GetOk("next_hop_gateway"); ok { 108 nextHopGateway = v.(string) 109 } 110 if v, ok := d.GetOk("next_hop_instance"); ok { 111 nextInstance, err := config.clientCompute.Instances.Get( 112 config.Project, 113 d.Get("next_hop_instance_zone").(string), 114 v.(string)).Do() 115 if err != nil { 116 return fmt.Errorf("Error reading instance: %s", err) 117 } 118 119 nextHopInstance = nextInstance.SelfLink 120 } 121 if v, ok := d.GetOk("next_hop_network"); ok { 122 nextNetwork, err := config.clientCompute.Networks.Get( 123 config.Project, v.(string)).Do() 124 if err != nil { 125 return fmt.Errorf("Error reading network: %s", err) 126 } 127 128 nextHopNetwork = nextNetwork.SelfLink 129 } 130 131 // Tags 132 var tags []string 133 if v := d.Get("tags").(*schema.Set); v.Len() > 0 { 134 tags = make([]string, v.Len()) 135 for i, v := range v.List() { 136 tags[i] = v.(string) 137 } 138 } 139 140 // Build the route parameter 141 route := &compute.Route{ 142 Name: d.Get("name").(string), 143 DestRange: d.Get("dest_range").(string), 144 Network: network.SelfLink, 145 NextHopInstance: nextHopInstance, 146 NextHopIp: nextHopIp, 147 NextHopNetwork: nextHopNetwork, 148 NextHopGateway: nextHopGateway, 149 Priority: int64(d.Get("priority").(int)), 150 Tags: tags, 151 } 152 log.Printf("[DEBUG] Route insert request: %#v", route) 153 op, err := config.clientCompute.Routes.Insert( 154 config.Project, route).Do() 155 if err != nil { 156 return fmt.Errorf("Error creating route: %s", err) 157 } 158 159 // It probably maybe worked, so store the ID now 160 d.SetId(route.Name) 161 162 // Wait for the operation to complete 163 w := &OperationWaiter{ 164 Service: config.clientCompute, 165 Op: op, 166 Project: config.Project, 167 Type: OperationWaitGlobal, 168 } 169 state := w.Conf() 170 state.Timeout = 2 * time.Minute 171 state.MinTimeout = 1 * time.Second 172 opRaw, err := state.WaitForState() 173 if err != nil { 174 return fmt.Errorf("Error waiting for route to create: %s", err) 175 } 176 op = opRaw.(*compute.Operation) 177 if op.Error != nil { 178 // The resource didn't actually create 179 d.SetId("") 180 181 // Return the error 182 return OperationError(*op.Error) 183 } 184 185 return resourceComputeRouteRead(d, meta) 186 } 187 188 func resourceComputeRouteRead(d *schema.ResourceData, meta interface{}) error { 189 config := meta.(*Config) 190 191 route, err := config.clientCompute.Routes.Get( 192 config.Project, d.Id()).Do() 193 if err != nil { 194 if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { 195 // The resource doesn't exist anymore 196 d.SetId("") 197 198 return nil 199 } 200 201 return fmt.Errorf("Error reading route: %#v", err) 202 } 203 204 d.Set("self_link", route.SelfLink) 205 206 return nil 207 } 208 209 func resourceComputeRouteDelete(d *schema.ResourceData, meta interface{}) error { 210 config := meta.(*Config) 211 212 // Delete the route 213 op, err := config.clientCompute.Routes.Delete( 214 config.Project, d.Id()).Do() 215 if err != nil { 216 return fmt.Errorf("Error deleting route: %s", err) 217 } 218 219 // Wait for the operation to complete 220 w := &OperationWaiter{ 221 Service: config.clientCompute, 222 Op: op, 223 Project: config.Project, 224 Type: OperationWaitGlobal, 225 } 226 state := w.Conf() 227 state.Timeout = 2 * time.Minute 228 state.MinTimeout = 1 * time.Second 229 opRaw, err := state.WaitForState() 230 if err != nil { 231 return fmt.Errorf("Error waiting for route to delete: %s", err) 232 } 233 op = opRaw.(*compute.Operation) 234 if op.Error != nil { 235 // Return the error 236 return OperationError(*op.Error) 237 } 238 239 d.SetId("") 240 return nil 241 }