Skip to content

Commit 913acef

Browse files
authored
Merge pull request #476 from Sherlock-Holo/gaap-rs-optional
feat: http rule realservers is optional
2 parents e2b56c8 + e456710 commit 913acef

File tree

5 files changed

+134
-23
lines changed

5 files changed

+134
-23
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
## 1.39.1 (Unreleased)
22

3+
ENHANCEMENTS:
4+
5+
* Resource: `tencentcloud_gaap_http_rule` argument `realservers` now is optional.
6+
37
## 1.39.0 (July 18, 2020)
48

59
ENHANCEMENTS:

tencentcloud/resource_tc_gaap_http_rule.go

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ func resourceTencentCloudGaapHttpRule() *schema.Resource {
179179
},
180180
"realservers": {
181181
Type: schema.TypeSet,
182-
Required: true,
182+
Optional: true,
183183
Set: func(v interface{}) int {
184184
m := v.(map[string]interface{})
185185
return hashcode.String(fmt.Sprintf("%s-%s-%d-%d", m["id"].(string), m["ip"].(string), m["port"].(int), m["weight"].(int)))
@@ -268,22 +268,6 @@ func resourceTencentCloudGaapHttpRuleCreate(d *schema.ResourceData, m interface{
268268
return errors.New("health_check_status_codes can't be empty")
269269
}
270270

271-
realserverSet := d.Get("realservers").(*schema.Set).List()
272-
realservers := make([]gaapRealserverBind, 0, len(realserverSet))
273-
for _, v := range realserverSet {
274-
m := v.(map[string]interface{})
275-
realservers = append(realservers, gaapRealserverBind{
276-
id: m["id"].(string),
277-
ip: m["ip"].(string),
278-
port: m["port"].(int),
279-
weight: m["weight"].(int),
280-
})
281-
}
282-
283-
if len(realservers) == 0 {
284-
return errors.New("realserver can't be empty")
285-
}
286-
287271
service := GaapService{client: m.(*TencentCloudClient).apiV3Conn}
288272

289273
id, err := service.CreateHttpRule(ctx, rule)
@@ -293,8 +277,23 @@ func resourceTencentCloudGaapHttpRuleCreate(d *schema.ResourceData, m interface{
293277

294278
d.SetId(id)
295279

296-
if err := service.BindHttpRuleRealservers(ctx, rule.listenerId, id, realservers); err != nil {
297-
return err
280+
if raw, ok := d.GetOk("realservers"); ok {
281+
realserverSet := raw.(*schema.Set).List()
282+
realservers := make([]gaapRealserverBind, 0, len(realserverSet))
283+
284+
for _, v := range realserverSet {
285+
m := v.(map[string]interface{})
286+
realservers = append(realservers, gaapRealserverBind{
287+
id: m["id"].(string),
288+
ip: m["ip"].(string),
289+
port: m["port"].(int),
290+
weight: m["weight"].(int),
291+
})
292+
}
293+
294+
if err := service.BindHttpRuleRealservers(ctx, rule.listenerId, id, realservers); err != nil {
295+
return err
296+
}
298297
}
299298

300299
return resourceTencentCloudGaapHttpRuleRead(d, m)
@@ -427,7 +426,9 @@ func resourceTencentCloudGaapHttpRuleUpdate(d *schema.ResourceData, m interface{
427426
}
428427

429428
var realservers []gaapRealserverBind
430-
if d.HasChange("realservers") {
429+
realserverUpdate := d.HasChange("realservers")
430+
431+
if realserverUpdate {
431432
set := d.Get("realservers").(*schema.Set).List()
432433
realservers = make([]gaapRealserverBind, 0, len(set))
433434
for _, v := range set {
@@ -466,10 +467,11 @@ func resourceTencentCloudGaapHttpRuleUpdate(d *schema.ResourceData, m interface{
466467
d.SetPartial("forward_host")
467468
}
468469

469-
if len(realservers) > 0 {
470+
if realserverUpdate {
470471
if err := service.BindHttpRuleRealservers(ctx, listenerId, id, realservers); err != nil {
471472
return err
472473
}
474+
473475
d.SetPartial("realservers")
474476
}
475477

tencentcloud/resource_tc_gaap_http_rule_test.go

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,85 @@ func TestAccTencentCloudGaapHttpRule_domainRealserver(t *testing.T) {
206206
})
207207
}
208208

209+
func TestAccTencentCloudGaapHttpRule_noRealserver(t *testing.T) {
210+
id := new(string)
211+
212+
resource.Test(t, resource.TestCase{
213+
PreCheck: func() { testAccPreCheck(t) },
214+
Providers: testAccProviders,
215+
CheckDestroy: testAccCheckGaapHttpRuleDestroy(id),
216+
Steps: []resource.TestStep{
217+
{
218+
Config: testAccGaapHttpRuleNoRealserver,
219+
Check: resource.ComposeTestCheckFunc(
220+
testAccCheckGaapHttpRuleExists("tencentcloud_gaap_http_rule.foo", id),
221+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "domain", "www.qq.com"),
222+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "path", "/"),
223+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "scheduler", "rr"),
224+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "realserver_type", "IP"),
225+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "health_check", "true"),
226+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "interval", "5"),
227+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "connect_timeout", "2"),
228+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "health_check_path", "/"),
229+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "health_check_method", "GET"),
230+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "health_check_status_codes.#", "1"),
231+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "health_check_status_codes."+strconv.Itoa(schema.HashInt(200)), "200"),
232+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "realservers.#", "0"),
233+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "forward_host", "default"),
234+
),
235+
},
236+
{
237+
ResourceName: "tencentcloud_gaap_http_rule.foo",
238+
ImportState: true,
239+
ImportStateVerify: true,
240+
},
241+
},
242+
})
243+
}
244+
245+
func TestAccTencentCloudGaapHttpRule_deleteRealserver(t *testing.T) {
246+
id := new(string)
247+
248+
resource.Test(t, resource.TestCase{
249+
PreCheck: func() { testAccPreCheck(t) },
250+
Providers: testAccProviders,
251+
CheckDestroy: testAccCheckGaapHttpRuleDestroy(id),
252+
Steps: []resource.TestStep{
253+
{
254+
Config: testAccGaapHttpRuleBasic,
255+
Check: resource.ComposeTestCheckFunc(
256+
testAccCheckGaapHttpRuleExists("tencentcloud_gaap_http_rule.foo", id),
257+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "domain", "www.qq.com"),
258+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "path", "/"),
259+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "scheduler", "rr"),
260+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "realserver_type", "IP"),
261+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "health_check", "true"),
262+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "interval", "5"),
263+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "connect_timeout", "2"),
264+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "health_check_path", "/"),
265+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "health_check_method", "GET"),
266+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "health_check_status_codes.#", "1"),
267+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "health_check_status_codes."+strconv.Itoa(schema.HashInt(200)), "200"),
268+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "realservers.#", "2"),
269+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "forward_host", "default"),
270+
),
271+
},
272+
{
273+
Config: testAccGaapHttpRuleNoRealserver,
274+
Check: resource.ComposeTestCheckFunc(
275+
testAccCheckGaapHttpRuleExists("tencentcloud_gaap_http_rule.foo", id),
276+
resource.TestCheckResourceAttr("tencentcloud_gaap_http_rule.foo", "realservers.#", "0"),
277+
),
278+
},
279+
{
280+
ResourceName: "tencentcloud_gaap_http_rule.foo",
281+
ImportState: true,
282+
ImportStateVerify: true,
283+
},
284+
},
285+
})
286+
}
287+
209288
func testAccCheckGaapHttpRuleExists(n string, id *string) resource.TestCheckFunc {
210289
return func(s *terraform.State) error {
211290
rs, ok := s.RootModule().Resources[n]
@@ -578,3 +657,28 @@ resource tencentcloud_gaap_http_rule "foo" {
578657
}
579658
}
580659
`, defaultGaapProxyId)
660+
661+
var testAccGaapHttpRuleNoRealserver = fmt.Sprintf(`
662+
resource tencentcloud_gaap_layer7_listener "foo" {
663+
protocol = "HTTP"
664+
name = "ci-test-gaap-l7-listener"
665+
port = 80
666+
proxy_id = "%s"
667+
}
668+
669+
resource tencentcloud_gaap_http_domain "foo" {
670+
listener_id = tencentcloud_gaap_layer7_listener.foo.id
671+
domain = "www.qq.com"
672+
}
673+
674+
resource tencentcloud_gaap_http_rule "foo" {
675+
listener_id = tencentcloud_gaap_layer7_listener.foo.id
676+
domain = tencentcloud_gaap_http_domain.foo.domain
677+
path = "/"
678+
realserver_type = "IP"
679+
health_check = true
680+
health_check_path = "/"
681+
health_check_method = "GET"
682+
health_check_status_codes = [200]
683+
}
684+
`, defaultGaapProxyId)

tencentcloud/service_tencentcloud_gaap.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2665,7 +2665,8 @@ func (me *GaapService) BindHttpRuleRealservers(ctx context.Context, listenerId,
26652665

26662666
request := gaap.NewBindRuleRealServersRequest()
26672667
request.RuleId = &ruleId
2668-
request.RealServerBindSet = make([]*gaap.RealServerBindSetReq, 0, len(realservers))
2668+
2669+
// if realservers is nil, request.RealServerBindSet will bi nil and remove realserver binding
26692670
for _, realserver := range realservers {
26702671
request.RealServerBindSet = append(request.RealServerBindSet, &gaap.RealServerBindSetReq{
26712672
RealServerId: helper.String(realserver.id),

website/docs/r/gaap_http_rule.html.markdown

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@ The following arguments are supported:
7676
* `listener_id` - (Required, ForceNew) ID of the layer7 listener.
7777
* `path` - (Required) Path of the forward rule. Maximum length is 80.
7878
* `realserver_type` - (Required, ForceNew) Type of the realserver, the available values include `IP` and `DOMAIN`.
79-
* `realservers` - (Required) An information list of GAAP realserver.
8079
* `connect_timeout` - (Optional) Timeout of the health check response, default value is 2s.
8180
* `forward_host` - (Optional) The default value of requested host which is forwarded to the realserver by the listener is `default`.
8281
* `health_check_method` - (Optional) Method of the health check, the available values includes `GET` and `HEAD`.
8382
* `health_check_path` - (Optional) Path of health check. Maximum length is 80.
8483
* `health_check_status_codes` - (Optional) Return code of confirmed normal, the available values include `100`, `200`, `300`, `400` and `500`.
8584
* `interval` - (Optional) Interval of the health check, default value is 5s.
85+
* `realservers` - (Optional) An information list of GAAP realserver.
8686
* `scheduler` - (Optional) Scheduling policy of the forward rule, default value is `rr`, the available values include `rr`, `wrr` and `lc`.
8787

8888
The `realservers` object supports the following:

0 commit comments

Comments
 (0)