Browse Source

add logs command

Signed-off-by: aiordache <[email protected]>
Signed-off-by: Nicolas De Loof <[email protected]>
aiordache 5 years ago
parent
commit
9dbff1eb72
5 changed files with 73 additions and 0 deletions
  1. 26 0
      ecs/cmd/commands/compose.go
  2. 1 0
      ecs/pkg/amazon/api.go
  3. 13 0
      ecs/pkg/amazon/logs.go
  4. 32 0
      ecs/pkg/amazon/sdk.go
  5. 1 0
      ecs/pkg/compose/api.go

+ 26 - 0
ecs/cmd/commands/compose.go

@@ -22,6 +22,7 @@ func ComposeCommand(dockerCli command.Cli) *cobra.Command {
 		ConvertCommand(dockerCli, opts),
 		UpCommand(dockerCli, opts),
 		DownCommand(dockerCli, opts),
+		LogsCommand(dockerCli, opts),
 	)
 	return cmd
 }
@@ -119,3 +120,28 @@ func DownCommand(dockerCli command.Cli, projectOpts *compose.ProjectOptions) *co
 	cmd.Flags().BoolVar(&opts.DeleteCluster, "delete-cluster", false, "Delete cluster")
 	return cmd
 }
+
+func LogsCommand(dockerCli command.Cli, projectOpts *compose.ProjectOptions) *cobra.Command {
+	cmd := &cobra.Command{
+		Use: "logs [PROJECT NAME]",
+		RunE: docker.WithAwsContext(dockerCli, func(clusteropts docker.AwsContext, args []string) error {
+			client, err := amazon.NewClient(clusteropts.Profile, clusteropts.Cluster, clusteropts.Region)
+			if err != nil {
+				return err
+			}
+			var name string
+
+			if len(args) == 0 {
+				project, err := compose.ProjectFromOptions(projectOpts)
+				if err != nil {
+					return err
+				}
+				name = project.Name
+			} else {
+				name = args[0]
+			}
+			return client.ComposeLogs(context.Background(), name)
+		}),
+	}
+	return cmd
+}

+ 1 - 0
ecs/pkg/amazon/api.go

@@ -5,5 +5,6 @@ package amazon
 type API interface {
 	downAPI
 	upAPI
+	logsAPI
 	secretsAPI
 }

+ 13 - 0
ecs/pkg/amazon/logs.go

@@ -0,0 +1,13 @@
+package amazon
+
+import (
+	"context"
+)
+
+func (c *client) ComposeLogs(ctx context.Context, projectName string) error {
+	return c.api.GetLogs(ctx, projectName)
+}
+
+type logsAPI interface {
+	GetLogs(ctx context.Context, name string) error
+}

+ 32 - 0
ecs/pkg/amazon/sdk.go

@@ -3,6 +3,7 @@ package amazon
 import (
 	"context"
 	"fmt"
+	"time"
 
 	"github.com/aws/aws-sdk-go/aws"
 	"github.com/aws/aws-sdk-go/aws/session"
@@ -307,3 +308,34 @@ func (s sdk) DeleteSecret(ctx context.Context, id string, recover bool) error {
 	_, err := s.SM.DeleteSecret(&secretsmanager.DeleteSecretInput{SecretId: &id, ForceDeleteWithoutRecovery: &force})
 	return err
 }
+
+func (s sdk) GetLogs(ctx context.Context, name string) error {
+	logGroup := fmt.Sprintf("/docker-compose/%s", name)
+	var startTime int64
+	for {
+		var hasMore = true
+		var token *string
+		token = nil
+		for hasMore {
+			events, err := s.CW.FilterLogEvents(&cloudwatchlogs.FilterLogEventsInput{
+				LogGroupName: aws.String(logGroup),
+				NextToken:    token,
+				StartTime:    aws.Int64(startTime),
+			})
+			if err != nil {
+				return err
+			}
+			if events.NextToken == nil {
+				hasMore = false
+			} else {
+				token = events.NextToken
+			}
+
+			for _, event := range events.Events {
+				fmt.Println(*event.Message)
+				startTime = *event.IngestionTime
+			}
+		}
+		time.Sleep(500 * time.Millisecond)
+	}
+}

+ 1 - 0
ecs/pkg/compose/api.go

@@ -11,6 +11,7 @@ type API interface {
 	Convert(project *Project) (*cloudformation.Template, error)
 	ComposeUp(ctx context.Context, project *Project) error
 	ComposeDown(ctx context.Context, projectName string, deleteCluster bool) error
+	ComposeLogs(ctx context.Context, projectName string) error
 
 	CreateSecret(ctx context.Context, secret docker.Secret) (string, error)
 	InspectSecret(ctx context.Context, id string) (docker.Secret, error)