Skip to content

Commit dd80f38

Browse files
authored
Merge pull request #1451 from tencentcloudstack/feat/add_as_operation
Feat/add as operation
2 parents 047529a + 6cd43d2 commit dd80f38

11 files changed

+686
-0
lines changed

.changelog/1451.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
```release-note:new-resource
2+
tencentcloud_as_remove_instances
3+
```
4+
5+
```release-note:new-resource
6+
tencentcloud_as_protect_instances
7+
```
8+
9+
```release-note:new-resource
10+
tencentcloud_as_start_instances
11+
```
12+
13+
```release-note:new-resource
14+
tencentcloud_as_stop_instances
15+
```

tencentcloud/provider.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ Auto Scaling(AS)
125125
tencentcloud_as_schedule
126126
tencentcloud_as_lifecycle_hook
127127
tencentcloud_as_notification
128+
tencentcloud_as_remove_instances
129+
tencentcloud_as_protect_instances
130+
tencentcloud_as_start_instances
131+
tencentcloud_as_stop_instances
128132
129133
Content Delivery Network(CDN)
130134
Data Source
@@ -1266,6 +1270,10 @@ func Provider() terraform.ResourceProvider {
12661270
"tencentcloud_as_schedule": resourceTencentCloudAsSchedule(),
12671271
"tencentcloud_as_lifecycle_hook": resourceTencentCloudAsLifecycleHook(),
12681272
"tencentcloud_as_notification": resourceTencentCloudAsNotification(),
1273+
"tencentcloud_as_remove_instances": resourceTencentCloudAsRemoveInstances(),
1274+
"tencentcloud_as_protect_instances": resourceTencentCloudAsProtectInstances(),
1275+
"tencentcloud_as_start_instances": resourceTencentCloudAsStartInstances(),
1276+
"tencentcloud_as_stop_instances": resourceTencentCloudAsStopInstances(),
12691277
"tencentcloud_mongodb_instance": resourceTencentCloudMongodbInstance(),
12701278
"tencentcloud_mongodb_sharding_instance": resourceTencentCloudMongodbShardingInstance(),
12711279
"tencentcloud_dayu_cc_http_policy": resourceTencentCloudDayuCCHttpPolicy(),
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/*
2+
Provides a resource to create a as protect_instances
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_as_protect_instances" "protect_instances" {
8+
auto_scaling_group_id = tencentcloud_as_scaling_group.scaling_group.id
9+
instance_ids = ["ins-xxxxx"]
10+
protected_from_scale_in = true
11+
}
12+
```
13+
14+
*/
15+
package tencentcloud
16+
17+
import (
18+
"log"
19+
20+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
21+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
22+
as "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419"
23+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
24+
)
25+
26+
func resourceTencentCloudAsProtectInstances() *schema.Resource {
27+
return &schema.Resource{
28+
Create: resourceTencentCloudAsProtectInstancesCreate,
29+
Read: resourceTencentCloudAsProtectInstancesRead,
30+
Delete: resourceTencentCloudAsProtectInstancesDelete,
31+
Schema: map[string]*schema.Schema{
32+
"auto_scaling_group_id": {
33+
Required: true,
34+
ForceNew: true,
35+
Type: schema.TypeString,
36+
Description: "Launch configuration ID.",
37+
},
38+
39+
"instance_ids": {
40+
Required: true,
41+
ForceNew: true,
42+
Type: schema.TypeSet,
43+
Elem: &schema.Schema{
44+
Type: schema.TypeString,
45+
},
46+
Description: "List of cvm instances to remove.",
47+
},
48+
49+
"protected_from_scale_in": {
50+
Required: true,
51+
ForceNew: true,
52+
Type: schema.TypeBool,
53+
Description: "If instances need protect.",
54+
},
55+
},
56+
}
57+
}
58+
59+
func resourceTencentCloudAsProtectInstancesCreate(d *schema.ResourceData, meta interface{}) error {
60+
defer logElapsed("data_source.tencentcloud_as_protect_instances.create")()
61+
defer inconsistentCheck(d, meta)()
62+
63+
logId := getLogId(contextNil)
64+
65+
var (
66+
request = as.NewSetInstancesProtectionRequest()
67+
)
68+
if v, ok := d.GetOk("auto_scaling_group_id"); ok {
69+
request.AutoScalingGroupId = helper.String(v.(string))
70+
}
71+
ids := make([]string, 0)
72+
if v, ok := d.GetOk("instance_ids"); ok {
73+
instanceIdsSet := v.(*schema.Set).List()
74+
for i := range instanceIdsSet {
75+
instanceIds := instanceIdsSet[i].(string)
76+
ids = append(ids, instanceIds)
77+
request.InstanceIds = append(request.InstanceIds, &instanceIds)
78+
}
79+
}
80+
81+
if v, _ := d.GetOk("protected_from_scale_in"); v != nil {
82+
request.ProtectedFromScaleIn = helper.Bool(v.(bool))
83+
}
84+
85+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
86+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseAsClient().SetInstancesProtection(request)
87+
if e != nil {
88+
return retryError(e)
89+
} else {
90+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
91+
}
92+
return nil
93+
})
94+
if err != nil {
95+
log.Printf("[CRITAL]%s operate as protectInstances failed, reason:%+v", logId, err)
96+
return nil
97+
}
98+
99+
// 需要 setId,可以通过InstancesId作为ID
100+
d.SetId(helper.DataResourceIdsHash(ids))
101+
102+
return resourceTencentCloudAsProtectInstancesRead(d, meta)
103+
}
104+
105+
func resourceTencentCloudAsProtectInstancesRead(d *schema.ResourceData, meta interface{}) error {
106+
defer logElapsed("resource.tencentcloud_as_protect_instances.read")()
107+
defer inconsistentCheck(d, meta)()
108+
109+
return nil
110+
}
111+
112+
func resourceTencentCloudAsProtectInstancesDelete(d *schema.ResourceData, meta interface{}) error {
113+
defer logElapsed("resource.tencentcloud_as_protect_instances.delete")()
114+
defer inconsistentCheck(d, meta)()
115+
116+
return nil
117+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/*
2+
Provides a resource to create a as remove_instances
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_as_remove_instances" "remove_instances" {
8+
auto_scaling_group_id = tencentcloud_as_scaling_group.scaling_group.id
9+
instance_ids = ["ins-xxxxxx"]
10+
}
11+
```
12+
*/
13+
package tencentcloud
14+
15+
import (
16+
"log"
17+
18+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
19+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
20+
as "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419"
21+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
22+
)
23+
24+
func resourceTencentCloudAsRemoveInstances() *schema.Resource {
25+
return &schema.Resource{
26+
Create: resourceTencentCloudAsRemoveInstancesCreate,
27+
Read: resourceTencentCloudAsRemoveInstancesRead,
28+
Delete: resourceTencentCloudAsRemoveInstancesDelete,
29+
Schema: map[string]*schema.Schema{
30+
"auto_scaling_group_id": {
31+
Required: true,
32+
ForceNew: true,
33+
Type: schema.TypeString,
34+
Description: "Launch configuration ID.",
35+
},
36+
37+
"instance_ids": {
38+
Required: true,
39+
ForceNew: true,
40+
Type: schema.TypeSet,
41+
Elem: &schema.Schema{
42+
Type: schema.TypeString,
43+
},
44+
Description: "List of cvm instances to remove.",
45+
},
46+
},
47+
}
48+
}
49+
50+
func resourceTencentCloudAsRemoveInstancesCreate(d *schema.ResourceData, meta interface{}) error {
51+
defer logElapsed("data_source.tencentcloud_as_remove_instances.create")()
52+
defer inconsistentCheck(d, meta)()
53+
54+
logId := getLogId(contextNil)
55+
56+
var (
57+
request = as.NewRemoveInstancesRequest()
58+
response = as.NewRemoveInstancesResponse()
59+
activityId string
60+
)
61+
if v, ok := d.GetOk("auto_scaling_group_id"); ok {
62+
request.AutoScalingGroupId = helper.String(v.(string))
63+
}
64+
65+
if v, ok := d.GetOk("instance_ids"); ok {
66+
instanceIdsSet := v.(*schema.Set).List()
67+
for i := range instanceIdsSet {
68+
instanceIds := instanceIdsSet[i].(string)
69+
request.InstanceIds = append(request.InstanceIds, &instanceIds)
70+
}
71+
}
72+
73+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
74+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseAsClient().RemoveInstances(request)
75+
if e != nil {
76+
return retryError(e)
77+
} else {
78+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
79+
}
80+
response = result
81+
return nil
82+
})
83+
if err != nil {
84+
log.Printf("[CRITAL]%s operate as removeInstances failed, reason:%+v", logId, err)
85+
return nil
86+
}
87+
88+
activityId = *response.Response.ActivityId
89+
d.SetId(activityId)
90+
91+
return resourceTencentCloudAsRemoveInstancesRead(d, meta)
92+
}
93+
94+
func resourceTencentCloudAsRemoveInstancesRead(d *schema.ResourceData, meta interface{}) error {
95+
defer logElapsed("resource.tencentcloud_as_remove_instances.read")()
96+
defer inconsistentCheck(d, meta)()
97+
98+
return nil
99+
}
100+
101+
func resourceTencentCloudAsRemoveInstancesDelete(d *schema.ResourceData, meta interface{}) error {
102+
defer logElapsed("resource.tencentcloud_as_remove_instances.delete")()
103+
defer inconsistentCheck(d, meta)()
104+
105+
return nil
106+
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
/*
2+
Provides a resource to create a as start_instances
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_as_start_instances" "start_instances" {
8+
auto_scaling_group_id = tencentcloud_as_scaling_group.scaling_group.id
9+
instance_ids = ["ins-xxxxx"]
10+
}
11+
```
12+
13+
*/
14+
package tencentcloud
15+
16+
import (
17+
"context"
18+
"fmt"
19+
"log"
20+
21+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
22+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
23+
as "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as/v20180419"
24+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
25+
)
26+
27+
func resourceTencentCloudAsStartInstances() *schema.Resource {
28+
return &schema.Resource{
29+
Create: resourceTencentCloudAsStartInstancesCreate,
30+
Read: resourceTencentCloudAsStartInstancesRead,
31+
Delete: resourceTencentCloudAsStartInstancesDelete,
32+
Schema: map[string]*schema.Schema{
33+
"auto_scaling_group_id": {
34+
Required: true,
35+
ForceNew: true,
36+
Type: schema.TypeString,
37+
Description: "Launch configuration ID.",
38+
},
39+
40+
"instance_ids": {
41+
Required: true,
42+
ForceNew: true,
43+
Type: schema.TypeSet,
44+
Elem: &schema.Schema{
45+
Type: schema.TypeString,
46+
},
47+
Description: "List of cvm instances to start.",
48+
},
49+
},
50+
}
51+
}
52+
53+
func resourceTencentCloudAsStartInstancesCreate(d *schema.ResourceData, meta interface{}) error {
54+
defer logElapsed("data_source.tencentcloud_as_start_instances.create")()
55+
defer inconsistentCheck(d, meta)()
56+
57+
logId := getLogId(contextNil)
58+
59+
var (
60+
request = as.NewStartAutoScalingInstancesRequest()
61+
response = as.NewStartAutoScalingInstancesResponse()
62+
activityId string
63+
)
64+
if v, ok := d.GetOk("auto_scaling_group_id"); ok {
65+
request.AutoScalingGroupId = helper.String(v.(string))
66+
}
67+
68+
if v, ok := d.GetOk("instance_ids"); ok {
69+
instanceIdsSet := v.(*schema.Set).List()
70+
for i := range instanceIdsSet {
71+
instanceIds := instanceIdsSet[i].(string)
72+
request.InstanceIds = append(request.InstanceIds, &instanceIds)
73+
}
74+
}
75+
76+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
77+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseAsClient().StartAutoScalingInstances(request)
78+
if e != nil {
79+
return retryError(e)
80+
} else {
81+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
82+
}
83+
response = result
84+
return nil
85+
})
86+
if err != nil {
87+
log.Printf("[CRITAL]%s operate as startInstances failed, reason:%+v", logId, err)
88+
return nil
89+
}
90+
91+
activityId = *response.Response.ActivityId
92+
93+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
94+
service := AsService{
95+
client: meta.(*TencentCloudClient).apiV3Conn,
96+
}
97+
98+
err = resource.Retry(4*readRetryTimeout, func() *resource.RetryError {
99+
status, err := service.DescribeActivityById(ctx, activityId)
100+
if err != nil {
101+
return resource.NonRetryableError(err)
102+
}
103+
if status == SCALING_GROUP_ACTIVITY_STATUS_INIT || status == SCALING_GROUP_ACTIVITY_STATUS_RUNNING {
104+
return resource.RetryableError(fmt.Errorf("remove status is running(%s)", status))
105+
}
106+
if status == SCALING_GROUP_ACTIVITY_STATUS_SUCCESSFUL {
107+
return nil
108+
}
109+
return resource.NonRetryableError(fmt.Errorf("remove status is failed(%s)", status))
110+
})
111+
if err != nil {
112+
return err
113+
}
114+
115+
d.SetId(activityId)
116+
117+
return resourceTencentCloudAsStartInstancesRead(d, meta)
118+
}
119+
120+
func resourceTencentCloudAsStartInstancesRead(d *schema.ResourceData, meta interface{}) error {
121+
defer logElapsed("resource.tencentcloud_as_start_instances.read")()
122+
defer inconsistentCheck(d, meta)()
123+
124+
return nil
125+
}
126+
127+
func resourceTencentCloudAsStartInstancesDelete(d *schema.ResourceData, meta interface{}) error {
128+
defer logElapsed("resource.tencentcloud_as_start_instances.delete")()
129+
defer inconsistentCheck(d, meta)()
130+
131+
return nil
132+
}

0 commit comments

Comments
 (0)