terraform/builtin/providers/logentries/resource_logentries_log.go

236 lines
5.7 KiB
Go

package logentries
import (
"fmt"
"github.com/hashicorp/terraform/helper/schema"
logentries "github.com/logentries/le_goclient"
"strconv"
)
func resourceLogentriesLog() *schema.Resource {
return &schema.Resource{
Create: resourceLogentriesLogCreate,
Read: resourceLogentriesLogRead,
Update: resourceLogentriesLogUpdate,
Delete: resourceLogentriesLogDelete,
Schema: map[string]*schema.Schema{
"token": &schema.Schema{
Type: schema.TypeString,
Computed: true,
ForceNew: true,
},
"logset_id": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"name": &schema.Schema{
Type: schema.TypeString,
Required: true,
},
"filename": &schema.Schema{
Type: schema.TypeString,
Optional: true,
},
"retention_period": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Default: "ACCOUNT_DEFAULT",
ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
value := v.(string)
allowed_values := []string{"1W", "2W", "1M", "2M", "6M", "1Y", "2Y", "UNLIMITED", "ACCOUNT_DEFAULT"}
if !sliceContains(value, allowed_values) {
errors = append(errors, fmt.Errorf("Invalid retention period: %s (must be one of: %s)", value, allowed_values))
}
return
},
},
"source": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Default: "token",
ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
value := v.(string)
allowed_values := []string{"token", "syslog", "agent", "api"}
if !sliceContains(value, allowed_values) {
errors = append(errors, fmt.Errorf("Invalid log source option: %s (must be one of: %s)", value, allowed_values))
}
return
},
},
"type": &schema.Schema{
Type: schema.TypeString,
Default: "",
Optional: true,
},
},
}
}
func resourceLogentriesLogCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*logentries.Client)
retentionPeriod, err := retentionPeriodForEnum(d.Get("retention_period").(string))
if err != nil {
return err
}
res, err := client.Log.Create(logentries.LogCreateRequest{
LogSetKey: d.Get("logset_id").(string),
Name: d.Get("name").(string),
Retention: strconv.FormatInt(retentionPeriod, 10),
Type: d.Get("type").(string),
Source: d.Get("source").(string),
Filename: d.Get("filename").(string),
})
if err != nil {
return err
}
d.SetId(res.Key)
return mapLogToSchema(client, res, d)
}
func resourceLogentriesLogRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*logentries.Client)
res, err := client.Log.Read(logentries.LogReadRequest{
LogSetKey: d.Get("logset_id").(string),
Key: d.Id(),
})
if err != nil {
return err
}
if res == nil {
d.SetId("")
return nil
}
return mapLogToSchema(client, res, d)
}
func resourceLogentriesLogUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*logentries.Client)
_, err := client.Log.Update(logentries.LogUpdateRequest{
Key: d.Id(),
Name: d.Get("name").(string),
Retention: d.Get("retention_period").(string),
Type: d.Get("type").(string),
Source: d.Get("source").(string),
Filename: d.Get("filename").(string),
})
if err != nil {
return err
}
return resourceLogentriesLogRead(d, meta)
}
func resourceLogentriesLogDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*logentries.Client)
err := client.Log.Delete(logentries.LogDeleteRequest{
LogSetKey: d.Get("logset_id").(string),
Key: d.Id(),
})
return err
}
func mapLogToSchema(client *logentries.Client, log *logentries.Log, d *schema.ResourceData) error {
d.Set("token", log.Token)
d.Set("name", log.Name)
d.Set("filename", log.Filename)
retentionEnum, err := enumForRetentionPeriod(log.Retention)
if err != nil {
return err
}
d.Set("retention_period", retentionEnum)
d.Set("source", log.Source)
if log.Type != "" {
logTypes, err := client.LogType.ReadDefault(logentries.LogTypeListRequest{})
if err != nil {
return err
}
logType := lookupTypeShortcut(log.Type, logTypes)
if logType == "" {
logTypes, err = client.LogType.Read(logentries.LogTypeListRequest{})
if err != nil {
return err
}
logType = lookupTypeShortcut(log.Type, logTypes)
}
d.Set("type", logType)
}
return nil
}
func enumForRetentionPeriod(retentionPeriod int64) (string, error) {
switch retentionPeriod {
case 604800000:
return "1W", nil
case 1209600000:
return "2W", nil
case 2678400000:
return "1M", nil
case 5356800000:
return "2M", nil
case 16070400000:
return "6M", nil
case 31536000000:
return "1Y", nil
case 63072000000:
return "2Y", nil
case 0:
return "UNLIMITED", nil
case -1:
return "ACCOUNT_DEFAULT", nil
}
return "", fmt.Errorf("Unknown retention period: %d", retentionPeriod)
}
func retentionPeriodForEnum(retentionPeriodEnum string) (int64, error) {
switch retentionPeriodEnum {
case "1W":
return 604800000, nil
case "2W":
return 1209600000, nil
case "1M":
return 2678400000, nil
case "2M":
return 5356800000, nil
case "6M":
return 16070400000, nil
case "1Y":
return 31536000000, nil
case "2Y":
return 63072000000, nil
case "UNLIMITED":
return 0, nil
case "ACCOUNT_DEFAULT":
return -1, nil
}
return 0, fmt.Errorf("Unknown retention period: %s", retentionPeriodEnum)
}
func lookupTypeShortcut(currentLogKey string, logTypes []logentries.LogType) string {
for _, logType := range logTypes {
if logType.Key == currentLogKey {
return logType.Shortcut
}
}
return ""
}
func sliceContains(a string, list []string) bool {
for _, b := range list {
if b == a {
return true
}
}
return false
}