Skip to content

Commit 9aa8bbd

Browse files
chrustyjen20
authored andcommitted
provider/google: Support named_port on instance_group_manager
This allows HTTP and HTTPs load-balancers to direct traffic to ports other than tcp/80 and tcp/443.
1 parent c42f25d commit 9aa8bbd

3 files changed

Lines changed: 129 additions & 0 deletions

File tree

builtin/providers/google/resource_compute_instance_group_manager.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,25 @@ func resourceComputeInstanceGroupManager() *schema.Resource {
5353
Required: true,
5454
},
5555

56+
"named_port": &schema.Schema{
57+
Type: schema.TypeList,
58+
Optional: true,
59+
Elem: &schema.Resource{
60+
Schema: map[string]*schema.Schema{
61+
62+
"name": &schema.Schema{
63+
Type: schema.TypeString,
64+
Required: true,
65+
},
66+
67+
"port": &schema.Schema{
68+
Type: schema.TypeInt,
69+
Required: true,
70+
},
71+
},
72+
},
73+
},
74+
5675
"update_strategy": &schema.Schema{
5776
Type: schema.TypeString,
5877
Optional: true,
@@ -88,6 +107,18 @@ func resourceComputeInstanceGroupManager() *schema.Resource {
88107
}
89108
}
90109

110+
func getNamedPorts(nps []interface{}) []*compute.NamedPort {
111+
namedPorts := make([]*compute.NamedPort, 0, len(nps))
112+
for _, v := range nps {
113+
np := v.(map[string]interface{})
114+
namedPorts = append(namedPorts, &compute.NamedPort{
115+
Name: np["name"].(string),
116+
Port: int64(np["port"].(int)),
117+
})
118+
}
119+
return namedPorts
120+
}
121+
91122
func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta interface{}) error {
92123
config := meta.(*Config)
93124

@@ -110,6 +141,10 @@ func resourceComputeInstanceGroupManagerCreate(d *schema.ResourceData, meta inte
110141
manager.Description = v.(string)
111142
}
112143

144+
if v, ok := d.GetOk("named_port"); ok {
145+
manager.NamedPorts = getNamedPorts(v.([]interface{}))
146+
}
147+
113148
if attr := d.Get("target_pools").(*schema.Set); attr.Len() > 0 {
114149
var s []string
115150
for _, v := range attr.List() {
@@ -160,6 +195,7 @@ func resourceComputeInstanceGroupManagerRead(d *schema.ResourceData, meta interf
160195
}
161196

162197
// Set computed fields
198+
d.Set("named_port", manager.NamedPorts)
163199
d.Set("fingerprint", manager.Fingerprint)
164200
d.Set("instance_group", manager.InstanceGroup)
165201
d.Set("target_size", manager.TargetSize)
@@ -253,6 +289,31 @@ func resourceComputeInstanceGroupManagerUpdate(d *schema.ResourceData, meta inte
253289
d.SetPartial("instance_template")
254290
}
255291

292+
// If named_port changes then update:
293+
if d.HasChange("named_port") {
294+
295+
// Build the parameters for a "SetNamedPorts" request:
296+
namedPorts := getNamedPorts(d.Get("named_port").([]interface{}))
297+
setNamedPorts := &compute.InstanceGroupsSetNamedPortsRequest{
298+
NamedPorts: namedPorts,
299+
}
300+
301+
// Make the request:
302+
op, err := config.clientCompute.InstanceGroups.SetNamedPorts(
303+
config.Project, d.Get("zone").(string), d.Id(), setNamedPorts).Do()
304+
if err != nil {
305+
return fmt.Errorf("Error updating InstanceGroupManager: %s", err)
306+
}
307+
308+
// Wait for the operation to complete:
309+
err = computeOperationWaitZone(config, op, d.Get("zone").(string), "Updating InstanceGroupManager")
310+
if err != nil {
311+
return err
312+
}
313+
314+
d.SetPartial("named_port")
315+
}
316+
256317
// If size changes trigger a resize
257318
if d.HasChange("target_size") {
258319
if v, ok := d.GetOk("target_size"); ok {

builtin/providers/google/resource_compute_instance_group_manager_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ func TestAccInstanceGroupManager_update(t *testing.T) {
5555
Check: resource.ComposeTestCheckFunc(
5656
testAccCheckInstanceGroupManagerExists(
5757
"google_compute_instance_group_manager.igm-update", &manager),
58+
testAccCheckInstanceGroupManagerNamedPorts(
59+
"google_compute_instance_group_manager.igm-update",
60+
map[string]int64{"customhttp": 8080},
61+
&manager),
5862
),
5963
},
6064
resource.TestStep{
@@ -65,6 +69,10 @@ func TestAccInstanceGroupManager_update(t *testing.T) {
6569
testAccCheckInstanceGroupManagerUpdated(
6670
"google_compute_instance_group_manager.igm-update", 3,
6771
"google_compute_target_pool.igm-update", template2),
72+
testAccCheckInstanceGroupManagerNamedPorts(
73+
"google_compute_instance_group_manager.igm-update",
74+
map[string]int64{"customhttp": 8080, "customhttps": 8443},
75+
&manager),
6876
),
6977
},
7078
},
@@ -157,6 +165,42 @@ func testAccCheckInstanceGroupManagerUpdated(n string, size int64, targetPool st
157165
}
158166
}
159167

168+
func testAccCheckInstanceGroupManagerNamedPorts(n string, np map[string]int64, instanceGroupManager *compute.InstanceGroupManager) resource.TestCheckFunc {
169+
return func(s *terraform.State) error {
170+
rs, ok := s.RootModule().Resources[n]
171+
if !ok {
172+
return fmt.Errorf("Not found: %s", n)
173+
}
174+
175+
if rs.Primary.ID == "" {
176+
return fmt.Errorf("No ID is set")
177+
}
178+
179+
config := testAccProvider.Meta().(*Config)
180+
181+
manager, err := config.clientCompute.InstanceGroupManagers.Get(
182+
config.Project, rs.Primary.Attributes["zone"], rs.Primary.ID).Do()
183+
if err != nil {
184+
return err
185+
}
186+
187+
var found bool
188+
for _, namedPort := range manager.NamedPorts {
189+
found = false
190+
for name, port := range np {
191+
if namedPort.Name == name && namedPort.Port == port {
192+
found = true
193+
}
194+
}
195+
if !found {
196+
return fmt.Errorf("named port incorrect")
197+
}
198+
}
199+
200+
return nil
201+
}
202+
}
203+
160204
func testAccInstanceGroupManager_basic(template, target, igm1, igm2 string) string {
161205
return fmt.Sprintf(`
162206
resource "google_compute_instance_template" "igm-basic" {
@@ -252,6 +296,10 @@ func testAccInstanceGroupManager_update(template, target, igm string) string {
252296
base_instance_name = "igm-update"
253297
zone = "us-central1-c"
254298
target_size = 2
299+
named_port {
300+
name = "customhttp"
301+
port = 8080
302+
}
255303
}`, template, target, igm)
256304
}
257305

@@ -322,5 +370,13 @@ func testAccInstanceGroupManager_update2(template1, target, template2, igm strin
322370
base_instance_name = "igm-update"
323371
zone = "us-central1-c"
324372
target_size = 3
373+
named_port {
374+
name = "customhttp"
375+
port = 8080
376+
}
377+
named_port {
378+
name = "customhttps"
379+
port = 8443
380+
}
325381
}`, template1, target, template2, igm)
326382
}

website/source/docs/providers/google/r/compute_instance_group_manager.html.markdown

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ resource "google_compute_instance_group_manager" "foobar" {
2525
base_instance_name = "foobar"
2626
zone = "us-central1-a"
2727
target_size = 2
28+
29+
named_port {
30+
name = "customHTTP"
31+
port = 8888
32+
}
33+
2834
}
2935
```
3036

@@ -63,6 +69,12 @@ affect existing instances.
6369

6470
* `zone` - (Required) The zone that instances in this group should be created in.
6571

72+
The `named_port` block supports: (Include a named_port block for each named-port required).
73+
74+
* `name` - (Required) The name of the port.
75+
76+
* `port` - (Required) The port number.
77+
6678
## Attributes Reference
6779

6880
The following attributes are exported:

0 commit comments

Comments
 (0)