github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/google/resource_compute_forwarding_rule.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 resourceComputeForwardingRule() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceComputeForwardingRuleCreate, 15 Read: resourceComputeForwardingRuleRead, 16 Delete: resourceComputeForwardingRuleDelete, 17 Update: resourceComputeForwardingRuleUpdate, 18 19 Schema: map[string]*schema.Schema{ 20 "name": &schema.Schema{ 21 Type: schema.TypeString, 22 Required: true, 23 ForceNew: true, 24 }, 25 26 "target": &schema.Schema{ 27 Type: schema.TypeString, 28 Required: true, 29 ForceNew: false, 30 }, 31 32 "description": &schema.Schema{ 33 Type: schema.TypeString, 34 Optional: true, 35 ForceNew: true, 36 }, 37 38 "ip_address": &schema.Schema{ 39 Type: schema.TypeString, 40 Optional: true, 41 ForceNew: true, 42 Computed: true, 43 }, 44 45 "ip_protocol": &schema.Schema{ 46 Type: schema.TypeString, 47 Optional: true, 48 ForceNew: true, 49 Computed: true, 50 }, 51 52 "port_range": &schema.Schema{ 53 Type: schema.TypeString, 54 Optional: true, 55 ForceNew: true, 56 }, 57 58 "project": &schema.Schema{ 59 Type: schema.TypeString, 60 Optional: true, 61 ForceNew: true, 62 }, 63 64 "region": &schema.Schema{ 65 Type: schema.TypeString, 66 Optional: true, 67 ForceNew: true, 68 }, 69 70 "self_link": &schema.Schema{ 71 Type: schema.TypeString, 72 Computed: true, 73 }, 74 }, 75 } 76 } 77 78 func resourceComputeForwardingRuleCreate(d *schema.ResourceData, meta interface{}) error { 79 config := meta.(*Config) 80 81 region, err := getRegion(d, config) 82 if err != nil { 83 return err 84 } 85 86 project, err := getProject(d, config) 87 if err != nil { 88 return err 89 } 90 91 frule := &compute.ForwardingRule{ 92 IPAddress: d.Get("ip_address").(string), 93 IPProtocol: d.Get("ip_protocol").(string), 94 Description: d.Get("description").(string), 95 Name: d.Get("name").(string), 96 PortRange: d.Get("port_range").(string), 97 Target: d.Get("target").(string), 98 } 99 100 log.Printf("[DEBUG] ForwardingRule insert request: %#v", frule) 101 op, err := config.clientCompute.ForwardingRules.Insert( 102 project, region, frule).Do() 103 if err != nil { 104 return fmt.Errorf("Error creating ForwardingRule: %s", err) 105 } 106 107 // It probably maybe worked, so store the ID now 108 d.SetId(frule.Name) 109 110 err = computeOperationWaitRegion(config, op, region, "Creating Fowarding Rule") 111 if err != nil { 112 return err 113 } 114 115 return resourceComputeForwardingRuleRead(d, meta) 116 } 117 118 func resourceComputeForwardingRuleUpdate(d *schema.ResourceData, meta interface{}) error { 119 config := meta.(*Config) 120 121 region, err := getRegion(d, config) 122 if err != nil { 123 return err 124 } 125 126 project, err := getProject(d, config) 127 if err != nil { 128 return err 129 } 130 131 d.Partial(true) 132 133 if d.HasChange("target") { 134 target_name := d.Get("target").(string) 135 target_ref := &compute.TargetReference{Target: target_name} 136 op, err := config.clientCompute.ForwardingRules.SetTarget( 137 project, region, d.Id(), target_ref).Do() 138 if err != nil { 139 return fmt.Errorf("Error updating target: %s", err) 140 } 141 142 err = computeOperationWaitRegion(config, op, region, "Updating Forwarding Rule") 143 if err != nil { 144 return err 145 } 146 147 d.SetPartial("target") 148 } 149 150 d.Partial(false) 151 152 return resourceComputeForwardingRuleRead(d, meta) 153 } 154 155 func resourceComputeForwardingRuleRead(d *schema.ResourceData, meta interface{}) error { 156 config := meta.(*Config) 157 158 region, err := getRegion(d, config) 159 if err != nil { 160 return err 161 } 162 163 project, err := getProject(d, config) 164 if err != nil { 165 return err 166 } 167 168 frule, err := config.clientCompute.ForwardingRules.Get( 169 project, region, d.Id()).Do() 170 if err != nil { 171 if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { 172 log.Printf("[WARN] Removing Forwarding Rule %q because it's gone", d.Get("name").(string)) 173 // The resource doesn't exist anymore 174 d.SetId("") 175 176 return nil 177 } 178 179 return fmt.Errorf("Error reading ForwardingRule: %s", err) 180 } 181 182 d.Set("ip_address", frule.IPAddress) 183 d.Set("ip_protocol", frule.IPProtocol) 184 d.Set("self_link", frule.SelfLink) 185 186 return nil 187 } 188 189 func resourceComputeForwardingRuleDelete(d *schema.ResourceData, meta interface{}) error { 190 config := meta.(*Config) 191 192 region, err := getRegion(d, config) 193 if err != nil { 194 return err 195 } 196 197 project, err := getProject(d, config) 198 if err != nil { 199 return err 200 } 201 202 // Delete the ForwardingRule 203 log.Printf("[DEBUG] ForwardingRule delete request") 204 op, err := config.clientCompute.ForwardingRules.Delete( 205 project, region, d.Id()).Do() 206 if err != nil { 207 return fmt.Errorf("Error deleting ForwardingRule: %s", err) 208 } 209 210 err = computeOperationWaitRegion(config, op, region, "Deleting Forwarding Rule") 211 if err != nil { 212 return err 213 } 214 215 d.SetId("") 216 return nil 217 }