github.com/joshgarnett/terraform@v0.5.4-0.20160219181435-92dc20bb3594/builtin/providers/google/resource_compute_route.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 ) 11 12 func resourceComputeRoute() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceComputeRouteCreate, 15 Read: resourceComputeRouteRead, 16 Delete: resourceComputeRouteDelete, 17 18 Schema: map[string]*schema.Schema{ 19 "name": &schema.Schema{ 20 Type: schema.TypeString, 21 Required: true, 22 ForceNew: true, 23 }, 24 25 "dest_range": &schema.Schema{ 26 Type: schema.TypeString, 27 Required: true, 28 ForceNew: true, 29 }, 30 31 "network": &schema.Schema{ 32 Type: schema.TypeString, 33 Required: true, 34 ForceNew: true, 35 }, 36 37 "next_hop_ip": &schema.Schema{ 38 Type: schema.TypeString, 39 Optional: true, 40 ForceNew: true, 41 }, 42 43 "next_hop_instance": &schema.Schema{ 44 Type: schema.TypeString, 45 Optional: true, 46 ForceNew: true, 47 }, 48 49 "next_hop_instance_zone": &schema.Schema{ 50 Type: schema.TypeString, 51 Optional: true, 52 ForceNew: true, 53 }, 54 55 "next_hop_gateway": &schema.Schema{ 56 Type: schema.TypeString, 57 Optional: true, 58 ForceNew: true, 59 }, 60 61 "next_hop_network": &schema.Schema{ 62 Type: schema.TypeString, 63 Optional: true, 64 ForceNew: true, 65 }, 66 67 "next_hop_vpn_tunnel": &schema.Schema{ 68 Type: schema.TypeString, 69 Optional: true, 70 ForceNew: true, 71 }, 72 73 "priority": &schema.Schema{ 74 Type: schema.TypeInt, 75 Required: true, 76 ForceNew: true, 77 }, 78 79 "tags": &schema.Schema{ 80 Type: schema.TypeSet, 81 Optional: true, 82 ForceNew: true, 83 Elem: &schema.Schema{Type: schema.TypeString}, 84 Set: schema.HashString, 85 }, 86 87 "self_link": &schema.Schema{ 88 Type: schema.TypeString, 89 Computed: true, 90 }, 91 }, 92 } 93 } 94 95 func resourceComputeRouteCreate(d *schema.ResourceData, meta interface{}) error { 96 config := meta.(*Config) 97 98 // Look up the network to attach the route to 99 network, err := config.clientCompute.Networks.Get( 100 config.Project, d.Get("network").(string)).Do() 101 if err != nil { 102 return fmt.Errorf("Error reading network: %s", err) 103 } 104 105 // Next hop data 106 var nextHopInstance, nextHopIp, nextHopNetwork, nextHopGateway, 107 nextHopVpnTunnel string 108 if v, ok := d.GetOk("next_hop_ip"); ok { 109 nextHopIp = v.(string) 110 } 111 if v, ok := d.GetOk("next_hop_gateway"); ok { 112 nextHopGateway = v.(string) 113 } 114 if v, ok := d.GetOk("next_hop_vpn_tunnel"); ok { 115 nextHopVpnTunnel = v.(string) 116 } 117 if v, ok := d.GetOk("next_hop_instance"); ok { 118 nextInstance, err := config.clientCompute.Instances.Get( 119 config.Project, 120 d.Get("next_hop_instance_zone").(string), 121 v.(string)).Do() 122 if err != nil { 123 return fmt.Errorf("Error reading instance: %s", err) 124 } 125 126 nextHopInstance = nextInstance.SelfLink 127 } 128 if v, ok := d.GetOk("next_hop_network"); ok { 129 nextNetwork, err := config.clientCompute.Networks.Get( 130 config.Project, v.(string)).Do() 131 if err != nil { 132 return fmt.Errorf("Error reading network: %s", err) 133 } 134 135 nextHopNetwork = nextNetwork.SelfLink 136 } 137 138 // Tags 139 var tags []string 140 if v := d.Get("tags").(*schema.Set); v.Len() > 0 { 141 tags = make([]string, v.Len()) 142 for i, v := range v.List() { 143 tags[i] = v.(string) 144 } 145 } 146 147 // Build the route parameter 148 route := &compute.Route{ 149 Name: d.Get("name").(string), 150 DestRange: d.Get("dest_range").(string), 151 Network: network.SelfLink, 152 NextHopInstance: nextHopInstance, 153 NextHopVpnTunnel: nextHopVpnTunnel, 154 NextHopIp: nextHopIp, 155 NextHopNetwork: nextHopNetwork, 156 NextHopGateway: nextHopGateway, 157 Priority: int64(d.Get("priority").(int)), 158 Tags: tags, 159 } 160 log.Printf("[DEBUG] Route insert request: %#v", route) 161 op, err := config.clientCompute.Routes.Insert( 162 config.Project, route).Do() 163 if err != nil { 164 return fmt.Errorf("Error creating route: %s", err) 165 } 166 167 // It probably maybe worked, so store the ID now 168 d.SetId(route.Name) 169 170 err = computeOperationWaitGlobal(config, op, "Creating Route") 171 if err != nil { 172 return err 173 } 174 175 return resourceComputeRouteRead(d, meta) 176 } 177 178 func resourceComputeRouteRead(d *schema.ResourceData, meta interface{}) error { 179 config := meta.(*Config) 180 181 route, err := config.clientCompute.Routes.Get( 182 config.Project, d.Id()).Do() 183 if err != nil { 184 if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { 185 log.Printf("[WARN] Removing Route %q because it's gone", d.Get("name").(string)) 186 // The resource doesn't exist anymore 187 d.SetId("") 188 189 return nil 190 } 191 192 return fmt.Errorf("Error reading route: %#v", err) 193 } 194 195 d.Set("self_link", route.SelfLink) 196 197 return nil 198 } 199 200 func resourceComputeRouteDelete(d *schema.ResourceData, meta interface{}) error { 201 config := meta.(*Config) 202 203 // Delete the route 204 op, err := config.clientCompute.Routes.Delete( 205 config.Project, d.Id()).Do() 206 if err != nil { 207 return fmt.Errorf("Error deleting route: %s", err) 208 } 209 210 err = computeOperationWaitGlobal(config, op, "Deleting Route") 211 if err != nil { 212 return err 213 } 214 215 d.SetId("") 216 return nil 217 }