github.com/subuk/terraform@v0.6.14-0.20160317140351-de1567c2e732/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 Computed: true, 64 }, 65 66 "next_hop_vpn_tunnel": &schema.Schema{ 67 Type: schema.TypeString, 68 Optional: true, 69 ForceNew: true, 70 }, 71 72 "priority": &schema.Schema{ 73 Type: schema.TypeInt, 74 Required: true, 75 ForceNew: true, 76 }, 77 78 "tags": &schema.Schema{ 79 Type: schema.TypeSet, 80 Optional: true, 81 ForceNew: true, 82 Elem: &schema.Schema{Type: schema.TypeString}, 83 Set: schema.HashString, 84 }, 85 86 "self_link": &schema.Schema{ 87 Type: schema.TypeString, 88 Computed: true, 89 }, 90 }, 91 } 92 } 93 94 func resourceComputeRouteCreate(d *schema.ResourceData, meta interface{}) error { 95 config := meta.(*Config) 96 97 // Look up the network to attach the route to 98 network, err := config.clientCompute.Networks.Get( 99 config.Project, d.Get("network").(string)).Do() 100 if err != nil { 101 return fmt.Errorf("Error reading network: %s", err) 102 } 103 104 // Next hop data 105 var nextHopInstance, nextHopIp, nextHopGateway, 106 nextHopVpnTunnel string 107 if v, ok := d.GetOk("next_hop_ip"); ok { 108 nextHopIp = v.(string) 109 } 110 if v, ok := d.GetOk("next_hop_gateway"); ok { 111 nextHopGateway = v.(string) 112 } 113 if v, ok := d.GetOk("next_hop_vpn_tunnel"); ok { 114 nextHopVpnTunnel = v.(string) 115 } 116 if v, ok := d.GetOk("next_hop_instance"); ok { 117 nextInstance, err := config.clientCompute.Instances.Get( 118 config.Project, 119 d.Get("next_hop_instance_zone").(string), 120 v.(string)).Do() 121 if err != nil { 122 return fmt.Errorf("Error reading instance: %s", err) 123 } 124 125 nextHopInstance = nextInstance.SelfLink 126 } 127 128 // Tags 129 var tags []string 130 if v := d.Get("tags").(*schema.Set); v.Len() > 0 { 131 tags = make([]string, v.Len()) 132 for i, v := range v.List() { 133 tags[i] = v.(string) 134 } 135 } 136 137 // Build the route parameter 138 route := &compute.Route{ 139 Name: d.Get("name").(string), 140 DestRange: d.Get("dest_range").(string), 141 Network: network.SelfLink, 142 NextHopInstance: nextHopInstance, 143 NextHopVpnTunnel: nextHopVpnTunnel, 144 NextHopIp: nextHopIp, 145 NextHopGateway: nextHopGateway, 146 Priority: int64(d.Get("priority").(int)), 147 Tags: tags, 148 } 149 log.Printf("[DEBUG] Route insert request: %#v", route) 150 op, err := config.clientCompute.Routes.Insert( 151 config.Project, route).Do() 152 if err != nil { 153 return fmt.Errorf("Error creating route: %s", err) 154 } 155 156 // It probably maybe worked, so store the ID now 157 d.SetId(route.Name) 158 159 err = computeOperationWaitGlobal(config, op, "Creating Route") 160 if err != nil { 161 return err 162 } 163 164 return resourceComputeRouteRead(d, meta) 165 } 166 167 func resourceComputeRouteRead(d *schema.ResourceData, meta interface{}) error { 168 config := meta.(*Config) 169 170 route, err := config.clientCompute.Routes.Get( 171 config.Project, d.Id()).Do() 172 if err != nil { 173 if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { 174 log.Printf("[WARN] Removing Route %q because it's gone", d.Get("name").(string)) 175 // The resource doesn't exist anymore 176 d.SetId("") 177 178 return nil 179 } 180 181 return fmt.Errorf("Error reading route: %#v", err) 182 } 183 184 d.Set("next_hop_network", route.NextHopNetwork) 185 d.Set("self_link", route.SelfLink) 186 187 return nil 188 } 189 190 func resourceComputeRouteDelete(d *schema.ResourceData, meta interface{}) error { 191 config := meta.(*Config) 192 193 // Delete the route 194 op, err := config.clientCompute.Routes.Delete( 195 config.Project, d.Id()).Do() 196 if err != nil { 197 return fmt.Errorf("Error deleting route: %s", err) 198 } 199 200 err = computeOperationWaitGlobal(config, op, "Deleting Route") 201 if err != nil { 202 return err 203 } 204 205 d.SetId("") 206 return nil 207 }