Skip to content

Improve TF_LOG_PROVIDER logs #471

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Mar 31, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ require (
github.com/Azure/go-autorest/autorest/azure/auth v0.5.8
github.com/Azure/go-autorest/autorest/to v0.4.0
github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
github.com/alessio/shellescape v1.4.1 // indirect
github.com/aohorodnyk/uid v1.1.0
github.com/aws/aws-sdk-go v1.40.27 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ github.com/aalpar/deheap v0.0.0-20200318053559-9a0c2883bd56 h1:hJO00l0f92EcQn8Yg
github.com/aalpar/deheap v0.0.0-20200318053559-9a0c2883bd56/go.mod h1:EJFoWbcEEVK22GYKONJjtMNamGYe6p+3x1Pr6zV5gFs=
github.com/abbot/go-http-auth v0.4.0 h1:QjmvZ5gSC7jm3Zg54DqWE/T5m1t2AfDu6QlXJT0EVT0=
github.com/abbot/go-http-auth v0.4.0/go.mod h1:Cz6ARTIzApMJDzh5bRMSUou6UMSp0IEXg9km/ci7TJM=
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk=
github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
Expand Down
66 changes: 37 additions & 29 deletions iterative/utils/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package utils
import (
"errors"
"fmt"
"math"
"strings"
"time"

"github.com/acarl005/stripansi"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/sirupsen/logrus"
)
Expand All @@ -18,16 +20,17 @@ type basicFormatter struct{}
func (f *basicFormatter) Format(entry *logrus.Entry) ([]byte, error) {
levelText := strings.ToUpper(entry.Level.String())
levelColor := colors[levelText]
tpl := "[%s] 🚀\x1b[%dmTPI\x1b[0m %s\n"
return []byte(fmt.Sprintf(tpl, levelText, levelColor, entry.Message)), nil
newPrefix := fmt.Sprintf("\x1b[%dmTPI [%s]\x1b[0m", levelColor, levelText)
return []byte(hideUnwantedPrefix(levelText, newPrefix, entry.Message)), nil
}

func init() {
colors["DEBUG"] = 34
colors["INFO"] = 36
colors["WARN"] = 33
colors["WARNING"] = 33
colors["ERROR"] = 31
colors["FATAL"] = 31
colors["SUCCESS"] = 32
colors["foreground"] = 35

logrus.SetLevel(logrus.DebugLevel)
Expand Down Expand Up @@ -66,46 +69,51 @@ func (f *tpiFormatter) Format(entry *logrus.Entry) ([]byte, error) {

if message == "status" {
status := d.Get("status").(map[string]interface{})
terminatedStr := "terminated 🔵"

running := "queued 🟣"
if status["running"] != nil {
running = terminatedStr
if status["running"].(int) == 1 {
running = "running 🟡"
}
}
message = fmt.Sprintf("\x1b[%dmStatus: queued 🔵\x1b[0m", colors["DEBUG"])

success := ""
if running == terminatedStr {
success = "without any output"
if status["succeeded"] != nil && status["succeeded"].(int) == 1 {
success = "succesfully 🟢"
}
if status["failed"] != nil && status["failed"].(int) == 1 {
success = "with errors 🔴"
}
if status["succeeded"] != nil && status["succeeded"].(int) >= d.Get("parallelism").(int) {
message = fmt.Sprintf("\x1b[%dmStatus: completed succesfully 🟢\x1b[0m", colors["SUCCESS"])
}
if status["failed"] != nil && status["failed"].(int) > 0 {
message = fmt.Sprintf("\x1b[%dmStatus: completed with errors 🔴\x1b[0m", colors["ERROR"])
}
if status["running"] != nil && status["running"].(int) >= d.Get("parallelism").(int) {
message = fmt.Sprintf("\x1b[%dmStatus: running 🟡\x1b[0m", colors["WARNING"])
Comment on lines +75 to +82
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Computed status, for future references

}

message = fmt.Sprintf("Task %s %s", running, success)
}

if message == "logs" {
message = ""
logs := d.Get("logs").([]interface{})
taskLogs := "No logs"
if len(logs) > 0 {
taskLogs = strings.Replace(logs[0].(string), "\n", fmt.Sprintf("\n[%s] ", levelText), -1)
for index, log := range logs {
prefix := fmt.Sprintf("\n\x1b[%dmLOG %d >> ", colors["foreground"], index)
message += strings.Trim(strings.ReplaceAll("\n"+strings.Trim(log.(string), "\n"), "\n", prefix), "\n")
if index+1 < len(logs) {
message += "\n"
}
}

message = fmt.Sprintf("Task logs:\x1b[%dm%s\x1b[0m", colors["foreground"], taskLogs)
}

tpl := "[%s] \x1b[%dm🚀TPI %s\x1b[0m %s'\n"
return []byte(fmt.Sprintf(tpl, levelText, levelColor, d.Id(), message)), nil
newPrefix := fmt.Sprintf("\x1b[%dmTPI [%s]\x1b[0m", levelColor, levelText)
return []byte(hideUnwantedPrefix(levelText, newPrefix, message)), nil
}

func TpiLogger(d *schema.ResourceData) *logrus.Entry {
logrus.SetFormatter(&tpiFormatter{})

return logrus.WithFields(logrus.Fields{"d": d})
}

func hideUnwantedPrefix(levelText, newPrefix, message string) string {
unwantedPrefixLength := len(fmt.Sprintf("yyyy-mm-ddThh:mm:ss.mmmZ [%s] provider.terraform-provider-iterative: [%[1]s]", levelText))

var output string
for _, line := range strings.Split(message, "\n") {
formattedLine := fmt.Sprintf("[%s]\r%s %s", levelText, newPrefix, line)
padding := strings.Repeat(" ", int(math.Max(float64(unwantedPrefixLength-len(stripansi.Strip(line))), 0)))
output += formattedLine + padding + "\n"
}

return output
}
15 changes: 12 additions & 3 deletions iterative/utils/logger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import (

func TestState(t *testing.T) {
d := generateSchemaData(t, map[string]interface{}{
"name": "mytask",
"name": "mytask",
"parallelism": "1",
"status": map[string]interface{}{
"running": 0,
"failed": 0,
Expand All @@ -21,7 +22,8 @@ func TestState(t *testing.T) {

func TestState2(t *testing.T) {
d := generateSchemaData(t, map[string]interface{}{
"name": "mytask",
"name": "mytask",
"parallelism": "1",
"status": map[string]interface{}{
"running": 0,
"failed": 1,
Expand All @@ -34,7 +36,8 @@ func TestState2(t *testing.T) {

func TestState3(t *testing.T) {
d := generateSchemaData(t, map[string]interface{}{
"name": "mytask",
"name": "mytask",
"parallelism": "1",
"status": map[string]interface{}{
"running": 0,
"succeeded": 1,
Expand Down Expand Up @@ -141,6 +144,12 @@ func generateSchemaData(t *testing.T, raw map[string]interface{}) *schema.Resour
Type: schema.TypeString,
},
},
"parallelism": {
Type: schema.TypeInt,
ForceNew: true,
Optional: true,
Default: 1,
},
"script": {
Type: schema.TypeString,
ForceNew: true,
Expand Down
64 changes: 32 additions & 32 deletions task/aws/task.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,145 +93,145 @@ type Task struct {
}

func (t *Task) Create(ctx context.Context) error {
logrus.Debug("Creating DefaultVPC...")
logrus.Info("Creating DefaultVPC...")
if err := t.DataSources.DefaultVPC.Read(ctx); err != nil {
return err
}
logrus.Debug("Creating DefaultVPCSubnet...")
logrus.Info("Creating DefaultVPCSubnet...")
if err := t.DataSources.DefaultVPCSubnet.Read(ctx); err != nil {
return err
}
logrus.Debug("Creating Image...")
logrus.Info("Creating Image...")
if err := t.DataSources.Image.Read(ctx); err != nil {
return err
}
logrus.Debug("Creating Bucket...")
logrus.Info("Creating Bucket...")
if err := t.Resources.Bucket.Create(ctx); err != nil {
return err
}
logrus.Debug("Creating SecurityGroup...")
logrus.Info("Creating SecurityGroup...")
if err := t.Resources.SecurityGroup.Create(ctx); err != nil {
return err
}
logrus.Debug("Creating KeyPair...")
logrus.Info("Creating KeyPair...")
if err := t.Resources.KeyPair.Create(ctx); err != nil {
return err
}
logrus.Debug("Creating Credentials...")
logrus.Info("Creating Credentials...")
if err := t.DataSources.Credentials.Read(ctx); err != nil {
return err
}
logrus.Debug("Creating LaunchTemplate...")
logrus.Info("Creating LaunchTemplate...")
if err := t.Resources.LaunchTemplate.Create(ctx); err != nil {
return err
}
logrus.Debug("Creating AutoScalingGroup...")
logrus.Info("Creating AutoScalingGroup...")
if err := t.Resources.AutoScalingGroup.Create(ctx); err != nil {
return err
}
logrus.Debug("Uploading Directory...")
logrus.Info("Uploading Directory...")
if t.Attributes.Environment.Directory != "" {
if err := t.Push(ctx, t.Attributes.Environment.Directory); err != nil {
return err
}
}
logrus.Debug("Starting task...")
logrus.Info("Starting task...")
if err := t.Start(ctx); err != nil {
return err
}
logrus.Debug("Done!")
logrus.Info("Done!")
t.Attributes.Addresses = t.Resources.AutoScalingGroup.Attributes.Addresses
t.Attributes.Status = t.Resources.AutoScalingGroup.Attributes.Status
t.Attributes.Events = t.Resources.AutoScalingGroup.Attributes.Events
return nil
}

func (t *Task) Read(ctx context.Context) error {
logrus.Debug("Reading DefaultVPC...")
logrus.Info("Reading DefaultVPC...")
if err := t.DataSources.DefaultVPC.Read(ctx); err != nil {
return err
}
logrus.Debug("Reading DefaultVPCSubnet...")
logrus.Info("Reading DefaultVPCSubnet...")
if err := t.DataSources.DefaultVPCSubnet.Read(ctx); err != nil {
return err
}
logrus.Debug("Reading Image...")
logrus.Info("Reading Image...")
if err := t.DataSources.Image.Read(ctx); err != nil {
return err
}
logrus.Debug("Reading Bucket...")
logrus.Info("Reading Bucket...")
if err := t.Resources.Bucket.Read(ctx); err != nil {
return err
}
logrus.Debug("Reading Credentials...")
logrus.Info("Reading Credentials...")
if err := t.DataSources.Credentials.Read(ctx); err != nil {
return err
}
logrus.Debug("Reading SecurityGroup...")
logrus.Info("Reading SecurityGroup...")
if err := t.Resources.SecurityGroup.Read(ctx); err != nil {
return err
}
logrus.Debug("Reading KeyPair...")
logrus.Info("Reading KeyPair...")
if err := t.Resources.KeyPair.Read(ctx); err != nil {
return err
}
logrus.Debug("Reading Credentials...")
logrus.Info("Reading Credentials...")
if err := t.DataSources.Credentials.Read(ctx); err != nil {
return err
}
logrus.Debug("Reading LaunchTemplate...")
logrus.Info("Reading LaunchTemplate...")
if err := t.Resources.LaunchTemplate.Read(ctx); err != nil {
return err
}
logrus.Debug("Reading AutoScalingGroup...")
logrus.Info("Reading AutoScalingGroup...")
if err := t.Resources.AutoScalingGroup.Read(ctx); err != nil {
return err
}
logrus.Debug("Done!")
logrus.Info("Done!")
t.Attributes.Addresses = t.Resources.AutoScalingGroup.Attributes.Addresses
t.Attributes.Status = t.Resources.AutoScalingGroup.Attributes.Status
t.Attributes.Events = t.Resources.AutoScalingGroup.Attributes.Events
return nil
}

func (t *Task) Delete(ctx context.Context) error {
logrus.Debug("Downloading Directory...")
logrus.Info("Downloading Directory...")
if t.Read(ctx) == nil {
if t.Attributes.Environment.DirectoryOut != "" {
if err := t.Pull(ctx, t.Attributes.Environment.Directory, t.Attributes.Environment.DirectoryOut); err != nil && err != common.NotFoundError {
return err
}
}
logrus.Debug("Emptying Bucket...")
logrus.Info("Emptying Bucket...")
if err := machine.Delete(ctx, (*t.DataSources.Credentials.Resource)["RCLONE_REMOTE"]); err != nil && err != common.NotFoundError {
return err
}
}
logrus.Debug("Deleting AutoScalingGroup...")
logrus.Info("Deleting AutoScalingGroup...")
if err := t.Resources.AutoScalingGroup.Delete(ctx); err != nil {
return err
}
logrus.Debug("Deleting LaunchTemplate...")
logrus.Info("Deleting LaunchTemplate...")
if err := t.Resources.LaunchTemplate.Delete(ctx); err != nil {
return err
}
logrus.Debug("Deleting KeyPair...")
logrus.Info("Deleting KeyPair...")
if err := t.Resources.KeyPair.Delete(ctx); err != nil {
return err
}
logrus.Debug("Deleting SecurityGroup...")
logrus.Info("Deleting SecurityGroup...")
if err := t.Resources.SecurityGroup.Delete(ctx); err != nil {
return err
}
logrus.Debug("Deleting Credentials...")
logrus.Info("Deleting Credentials...")
if err := t.DataSources.Credentials.Read(ctx); err != nil {
return err
}
logrus.Debug("Deleting Bucket...")
logrus.Info("Deleting Bucket...")
if err := t.Resources.Bucket.Delete(ctx); err != nil {
return err
}
logrus.Debug("Done!")
logrus.Info("Done!")
return nil
}

Expand Down
Loading