alibabacloudstack/resource_apsarastack_log_store.go (295 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 resourceAlibabacloudStackLogStore() *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, }, "retention_period": { Type: schema.TypeInt, Optional: true, Default: 30, ValidateFunc: validation.IntBetween(1, 3650), }, "shard_count": { Type: schema.TypeInt, Required: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { if old == "" { return false } return true }, }, "shards": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "id": { Type: schema.TypeInt, Computed: true, }, "status": { Type: schema.TypeString, Computed: true, }, "begin_key": { Type: schema.TypeString, Computed: true, }, "end_key": { Type: schema.TypeString, Computed: true, }, }, }, }, "auto_split": { Type: schema.TypeBool, Optional: true, Default: false, }, "max_split_shard_count": { Type: schema.TypeInt, Optional: true, Default: 0, ValidateFunc: validation.IntBetween(1, 64), }, "encryption": { Type: schema.TypeBool, Optional: true, }, "append_meta": { Type: schema.TypeBool, Optional: true, Default: true, }, "enable_web_tracking": { Type: schema.TypeBool, Optional: true, Default: false, }, "cmk_key_id": { Type: schema.TypeString, Optional: true, }, "arn": { Type: schema.TypeString, Optional: true, }, "encrypt_type": { Type: schema.TypeString, Optional: true, ForceNew: true, Default: "sm4_gcm", ValidateFunc: validation.StringInSlice([]string{"sm4_gcm", "aes_gcm"}, false), }, }, } setResourceFunc(resource, resourceAlibabacloudStackLogStoreCreate, resourceAlibabacloudStackLogStoreRead, resourceAlibabacloudStackLogStoreUpdate, resourceAlibabacloudStackLogStoreDelete) return resource } func resourceAlibabacloudStackLogStoreCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) update := false if v, ok := d.GetOk("encryption"); ok { update = v.(bool) } var logstore *sls.LogStore if update { logstore = &sls.LogStore{ Name: d.Get("name").(string), TTL: d.Get("retention_period").(int), ShardCount: d.Get("shard_count").(int), WebTracking: d.Get("enable_web_tracking").(bool), AutoSplit: d.Get("auto_split").(bool), MaxSplitShard: d.Get("max_split_shard_count").(int), AppendMeta: d.Get("append_meta").(bool), Encrypt_conf: sls.Encrypt_conf{ Enable: true, Encrypt_type: d.Get("encrypt_type").(string), UserCmkInfo: &sls.EncryptUserCmkConf{ CmkKeyId: d.Get("cmk_key_id").(string), Arn: d.Get("arn").(string), RegionId: client.RegionId, }, }, } } else { logstore = &sls.LogStore{ Name: d.Get("name").(string), TTL: d.Get("retention_period").(int), ShardCount: d.Get("shard_count").(int), WebTracking: d.Get("enable_web_tracking").(bool), AutoSplit: d.Get("auto_split").(bool), MaxSplitShard: d.Get("max_split_shard_count").(int), AppendMeta: d.Get("append_meta").(bool), } } err := resource.Retry(3*time.Minute, func() *resource.RetryError { raw, err := client.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) { return nil, slsClient.CreateLogStoreV2(d.Get("project").(string), logstore) }) addDebug("CreateLogStoreV2", raw, logstore, map[string]interface{}{ "project": d.Get("project").(string), "logstore": logstore, }) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"InternalServerError", errmsgs.LogClientTimeout}) { return resource.RetryableError(err) } errmsg := "" return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_log_store", "CreateLogStoreV2", errmsgs.AlibabacloudStackLogGoSdkERROR, errmsg)) } return nil }) if err != nil { return err } d.SetId(fmt.Sprintf("%s%s%s", d.Get("project").(string), COLON_SEPARATED, d.Get("name").(string))) return nil } func resourceAlibabacloudStackLogStoreRead(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.DescribeLogStore(d.Id()) if err != nil { if errmsgs.NotFoundError(err) { d.SetId("") return nil } return err } d.Set("project", parts[0]) d.Set("name", object.Name) d.Set("retention_period", object.TTL) d.Set("shard_count", object.ShardCount) var shards []*sls.Shard err = resource.Retry(2*time.Minute, func() *resource.RetryError { shards, err = object.ListShards() if err != nil { if errmsgs.IsExpectedErrors(err, []string{"InternalServerError"}) { return resource.RetryableError(err) } errmsg := "" return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_log_store", "ListShards", errmsgs.AlibabacloudStackLogGoSdkERROR, errmsg)) } addDebug("ListShards", shards) return nil }) if err != nil { return err } var shardList []map[string]interface{} for _, s := range shards { mapping := map[string]interface{}{ "id": s.ShardID, "status": s.Status, "begin_key": s.InclusiveBeginKey, "end_key": s.ExclusiveBeginKey, } shardList = append(shardList, mapping) } d.Set("shards", shardList) d.Set("append_meta", object.AppendMeta) d.Set("auto_split", object.AutoSplit) d.Set("enable_web_tracking", object.WebTracking) d.Set("max_split_shard_count", object.MaxSplitShard) return nil } func resourceAlibabacloudStackLogStoreUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) logService := LogService{client} if d.IsNewResource() { return nil } parts, err := ParseResourceId(d.Id(), 2) if err != nil { return errmsgs.WrapError(err) } d.Partial(true) update := false if d.HasChange("retention_period") { update = true //d.SetPartial("retention_period") } if d.HasChange("max_split_shard_count") { update = true //d.SetPartial("max_split_shard_count") } if d.HasChange("enable_web_tracking") { update = true //d.SetPartial("enable_web_tracking") } if d.HasChange("append_meta") { update = true //d.SetPartial("append_meta") } if d.HasChange("auto_split") { update = true //d.SetPartial("auto_split") } if update { store, err := logService.DescribeLogStore(d.Id()) if err != nil { return errmsgs.WrapError(err) } store.MaxSplitShard = d.Get("max_split_shard_count").(int) store.TTL = d.Get("retention_period").(int) store.WebTracking = d.Get("enable_web_tracking").(bool) store.AppendMeta = d.Get("append_meta").(bool) store.AutoSplit = d.Get("auto_split").(bool) var requestInfo *sls.Client raw, err := client.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return nil, slsClient.UpdateLogStoreV2(parts[0], store) }) if err != nil { errmsg := "" return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), "UpdateLogStoreV2", errmsgs.AlibabacloudStackLogGoSdkERROR, errmsg) } if debugOn() { addDebug("UpdateLogStoreV2", raw, requestInfo, map[string]interface{}{ "project": parts[0], "logstore": store, }) } } d.Partial(false) return nil } func resourceAlibabacloudStackLogStoreDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) name := d.Get("name").(string) project := d.Get("project").(string) var requestInfo *sls.Client raw, err := client.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) { return nil, slsClient.DeleteLogStore(project, name) }) addDebug("DeleteLogStore", raw, requestInfo, map[string]interface{}{ "project": project, "logstore": name, }) if err != nil { errmsg := "" return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), "DeleteLogStore", errmsgs.AlibabacloudStackLogGoSdkERROR, errmsg) } return nil }