github.com/IBM-Cloud/terraform@v0.6.4-0.20170726051544-8872b87621df/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 ) 10 11 func resourceComputeForwardingRule() *schema.Resource { 12 return &schema.Resource{ 13 Create: resourceComputeForwardingRuleCreate, 14 Read: resourceComputeForwardingRuleRead, 15 Delete: resourceComputeForwardingRuleDelete, 16 Update: resourceComputeForwardingRuleUpdate, 17 Importer: &schema.ResourceImporter{ 18 State: schema.ImportStatePassthrough, 19 }, 20 21 Schema: map[string]*schema.Schema{ 22 "name": &schema.Schema{ 23 Type: schema.TypeString, 24 Required: true, 25 ForceNew: true, 26 }, 27 28 "target": &schema.Schema{ 29 Type: schema.TypeString, 30 Optional: true, 31 ForceNew: false, 32 }, 33 34 "backend_service": &schema.Schema{ 35 Type: schema.TypeString, 36 Optional: true, 37 ForceNew: true, 38 }, 39 40 "description": &schema.Schema{ 41 Type: schema.TypeString, 42 Optional: true, 43 ForceNew: true, 44 }, 45 46 "ip_address": &schema.Schema{ 47 Type: schema.TypeString, 48 Optional: true, 49 ForceNew: true, 50 Computed: true, 51 }, 52 53 "ip_protocol": &schema.Schema{ 54 Type: schema.TypeString, 55 Optional: true, 56 ForceNew: true, 57 Computed: true, 58 }, 59 60 "load_balancing_scheme": &schema.Schema{ 61 Type: schema.TypeString, 62 Optional: true, 63 ForceNew: true, 64 Default: "EXTERNAL", 65 }, 66 67 "network": &schema.Schema{ 68 Type: schema.TypeString, 69 Optional: true, 70 ForceNew: true, 71 Computed: true, 72 }, 73 74 "port_range": &schema.Schema{ 75 Type: schema.TypeString, 76 Optional: true, 77 ForceNew: true, 78 DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { 79 if old == new+"-"+new { 80 return true 81 } 82 return false 83 }, 84 }, 85 86 "ports": &schema.Schema{ 87 Type: schema.TypeSet, 88 Elem: &schema.Schema{Type: schema.TypeString}, 89 Optional: true, 90 ForceNew: true, 91 Set: schema.HashString, 92 MaxItems: 5, 93 }, 94 95 "project": &schema.Schema{ 96 Type: schema.TypeString, 97 Optional: true, 98 ForceNew: true, 99 Computed: true, 100 }, 101 102 "region": &schema.Schema{ 103 Type: schema.TypeString, 104 Optional: true, 105 ForceNew: true, 106 Computed: true, 107 }, 108 109 "self_link": &schema.Schema{ 110 Type: schema.TypeString, 111 Computed: true, 112 }, 113 114 "subnetwork": &schema.Schema{ 115 Type: schema.TypeString, 116 Optional: true, 117 ForceNew: true, 118 Computed: true, 119 }, 120 }, 121 } 122 } 123 124 func resourceComputeForwardingRuleCreate(d *schema.ResourceData, meta interface{}) error { 125 config := meta.(*Config) 126 127 region, err := getRegion(d, config) 128 if err != nil { 129 return err 130 } 131 132 project, err := getProject(d, config) 133 if err != nil { 134 return err 135 } 136 137 ps := d.Get("ports").(*schema.Set).List() 138 ports := make([]string, 0, len(ps)) 139 for _, v := range ps { 140 ports = append(ports, v.(string)) 141 } 142 143 frule := &compute.ForwardingRule{ 144 BackendService: d.Get("backend_service").(string), 145 IPAddress: d.Get("ip_address").(string), 146 IPProtocol: d.Get("ip_protocol").(string), 147 Description: d.Get("description").(string), 148 LoadBalancingScheme: d.Get("load_balancing_scheme").(string), 149 Name: d.Get("name").(string), 150 Network: d.Get("network").(string), 151 PortRange: d.Get("port_range").(string), 152 Ports: ports, 153 Subnetwork: d.Get("subnetwork").(string), 154 Target: d.Get("target").(string), 155 } 156 157 log.Printf("[DEBUG] ForwardingRule insert request: %#v", frule) 158 op, err := config.clientCompute.ForwardingRules.Insert( 159 project, region, frule).Do() 160 if err != nil { 161 return fmt.Errorf("Error creating ForwardingRule: %s", err) 162 } 163 164 // It probably maybe worked, so store the ID now 165 d.SetId(frule.Name) 166 167 err = computeOperationWaitRegion(config, op, project, region, "Creating Fowarding Rule") 168 if err != nil { 169 return err 170 } 171 172 return resourceComputeForwardingRuleRead(d, meta) 173 } 174 175 func resourceComputeForwardingRuleUpdate(d *schema.ResourceData, meta interface{}) error { 176 config := meta.(*Config) 177 178 region, err := getRegion(d, config) 179 if err != nil { 180 return err 181 } 182 183 project, err := getProject(d, config) 184 if err != nil { 185 return err 186 } 187 188 d.Partial(true) 189 190 if d.HasChange("target") { 191 target_name := d.Get("target").(string) 192 target_ref := &compute.TargetReference{Target: target_name} 193 op, err := config.clientCompute.ForwardingRules.SetTarget( 194 project, region, d.Id(), target_ref).Do() 195 if err != nil { 196 return fmt.Errorf("Error updating target: %s", err) 197 } 198 199 err = computeOperationWaitRegion(config, op, project, region, "Updating Forwarding Rule") 200 if err != nil { 201 return err 202 } 203 204 d.SetPartial("target") 205 } 206 207 d.Partial(false) 208 209 return resourceComputeForwardingRuleRead(d, meta) 210 } 211 212 func resourceComputeForwardingRuleRead(d *schema.ResourceData, meta interface{}) error { 213 config := meta.(*Config) 214 215 region, err := getRegion(d, config) 216 if err != nil { 217 return err 218 } 219 220 project, err := getProject(d, config) 221 if err != nil { 222 return err 223 } 224 225 frule, err := config.clientCompute.ForwardingRules.Get( 226 project, region, d.Id()).Do() 227 if err != nil { 228 return handleNotFoundError(err, d, fmt.Sprintf("Forwarding Rule %q", d.Get("name").(string))) 229 } 230 231 d.Set("name", frule.Name) 232 d.Set("target", frule.Target) 233 d.Set("backend_service", frule.BackendService) 234 d.Set("description", frule.Description) 235 d.Set("load_balancing_scheme", frule.LoadBalancingScheme) 236 d.Set("network", frule.Network) 237 d.Set("port_range", frule.PortRange) 238 d.Set("ports", frule.Ports) 239 d.Set("project", project) 240 d.Set("region", region) 241 d.Set("subnetwork", frule.Subnetwork) 242 d.Set("ip_address", frule.IPAddress) 243 d.Set("ip_protocol", frule.IPProtocol) 244 d.Set("self_link", frule.SelfLink) 245 return nil 246 } 247 248 func resourceComputeForwardingRuleDelete(d *schema.ResourceData, meta interface{}) error { 249 config := meta.(*Config) 250 251 region, err := getRegion(d, config) 252 if err != nil { 253 return err 254 } 255 256 project, err := getProject(d, config) 257 if err != nil { 258 return err 259 } 260 261 // Delete the ForwardingRule 262 log.Printf("[DEBUG] ForwardingRule delete request") 263 op, err := config.clientCompute.ForwardingRules.Delete( 264 project, region, d.Id()).Do() 265 if err != nil { 266 return fmt.Errorf("Error deleting ForwardingRule: %s", err) 267 } 268 269 err = computeOperationWaitRegion(config, op, project, region, "Deleting Forwarding Rule") 270 if err != nil { 271 return err 272 } 273 274 d.SetId("") 275 return nil 276 }