alibabacloudstack/resource_apsarastack_log_machine_group.go (177 lines of code) (raw):
package alibabacloudstack
import (
"fmt"
"time"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
sls "github.com/aliyun/aliyun-log-go-sdk"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func resourceAlibabacloudStackLogMachineGroup() *schema.Resource {
resource := &schema.Resource{
Schema: map[string]*schema.Schema{
"project": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"identify_type": {
Type: schema.TypeString,
Optional: true,
Default: sls.MachineIDTypeIP,
ValidateFunc: validation.StringInSlice([]string{sls.MachineIDTypeIP, sls.MachineIDTypeUserDefined}, false),
},
"topic": {
Type: schema.TypeString,
Optional: true,
},
"identify_list": {
Type: schema.TypeSet,
Elem: &schema.Schema{Type: schema.TypeString},
Required: true,
MinItems: 1,
},
},
}
setResourceFunc(resource, resourceAlibabacloudStackLogMachineGroupCreate, resourceAlibabacloudStackLogMachineGroupRead, resourceAlibabacloudStackLogMachineGroupUpdate, resourceAlibabacloudStackLogMachineGroupDelete)
return resource
}
func resourceAlibabacloudStackLogMachineGroupCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
params := &sls.MachineGroup{
Name: d.Get("name").(string),
MachineIDType: d.Get("identify_type").(string),
MachineIDList: expandStringList(d.Get("identify_list").(*schema.Set).List()),
Attribute: sls.MachinGroupAttribute{
TopicName: d.Get("topic").(string),
},
}
var requestInfo *sls.Client
if err := resource.Retry(2*time.Minute, func() *resource.RetryError {
raw, err := client.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
requestInfo = slsClient
return nil, slsClient.CreateMachineGroup(d.Get("project").(string), params)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{errmsgs.LogClientTimeout}) {
time.Sleep(5 * time.Second)
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
if debugOn() {
addDebug("CreateMachineGroup", raw, requestInfo, map[string]interface{}{
"project": d.Get("project").(string),
"MachineGroup": params,
})
}
return nil
}); err != nil {
return err
}
d.SetId(fmt.Sprintf("%s%s%s", d.Get("project").(string), COLON_SEPARATED, d.Get("name").(string)))
return nil
}
func resourceAlibabacloudStackLogMachineGroupRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
logService := LogService{client}
parts, err := ParseResourceId(d.Id(), 2)
if err != nil {
return errmsgs.WrapError(err)
}
object, err := logService.DescribeLogMachineGroup(d.Id())
if err != nil {
if errmsgs.NotFoundError(err) {
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
d.Set("project", parts[0])
d.Set("name", object.Name)
d.Set("identify_type", object.MachineIDType)
d.Set("identify_list", object.MachineIDList)
d.Set("topic", object.Attribute.TopicName)
return nil
}
func resourceAlibabacloudStackLogMachineGroupUpdate(d *schema.ResourceData, meta interface{}) error {
if d.HasChanges("identify_type", "identify_list", "topic") {
parts, err := ParseResourceId(d.Id(), 2)
if err != nil {
return errmsgs.WrapError(err)
}
client := meta.(*connectivity.AlibabacloudStackClient)
var requestInfo *sls.Client
params := &sls.MachineGroup{
Name: parts[1],
MachineIDType: d.Get("identify_type").(string),
MachineIDList: expandStringList(d.Get("identify_list").(*schema.Set).List()),
Attribute: sls.MachinGroupAttribute{
TopicName: d.Get("topic").(string),
},
}
if err := resource.Retry(2*time.Minute, func() *resource.RetryError {
raw, err := client.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
requestInfo = slsClient
return nil, slsClient.UpdateMachineGroup(parts[0], params)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{errmsgs.LogClientTimeout}) {
time.Sleep(5 * time.Second)
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
if debugOn() {
addDebug("UpdateMachineGroup", raw, requestInfo, map[string]interface{}{
"project": parts[0],
"MachineGroup": params,
})
}
return nil
}); err != nil {
return err
}
}
return nil
}
func resourceAlibabacloudStackLogMachineGroupDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
logService := LogService{client}
parts, err := ParseResourceId(d.Id(), 2)
if err != nil {
return errmsgs.WrapError(err)
}
var requestInfo *sls.Client
err = resource.Retry(3*time.Minute, func() *resource.RetryError {
raw, err := client.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
requestInfo = slsClient
return nil, slsClient.DeleteMachineGroup(parts[0], parts[1])
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{errmsgs.LogClientTimeout}) {
time.Sleep(5 * time.Second)
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
if debugOn() {
addDebug("DeleteMachineGroup", raw, requestInfo, map[string]interface{}{
"project": parts[0],
"machineGroup": parts[1],
})
}
return nil
})
if err != nil {
return err
}
return errmsgs.WrapError(logService.WaitForLogMachineGroup(d.Id(), Deleted, DefaultTimeout))
}