From 1c7270b6979cfc70e2ab6d0c71f0b3f66b1afda1 Mon Sep 17 00:00:00 2001 From: Djordje Lukic Date: Sun, 3 May 2020 13:41:45 +0200 Subject: [PATCH] Implement logs --- azure/aci.go | 10 ++++++++++ azure/backend.go | 10 ++++++++++ cli/cmd/logs.go | 39 +++++++++++++++++++++++++++++++++++++++ cli/main.go | 1 + containers/api.go | 2 ++ example/backend.go | 5 +++++ 6 files changed, 67 insertions(+) create mode 100644 cli/cmd/logs.go diff --git a/azure/aci.go b/azure/aci.go index 0bf48346a..25396dfce 100644 --- a/azure/aci.go +++ b/azure/aci.go @@ -224,6 +224,16 @@ func exec(ctx context.Context, address string, password string, reader io.Reader } } +func getACIContainerLogs(ctx context.Context, aciContext store.AciContext, containerGroupName, containerName string) (string, error) { + containerClient := getContainerClient(aciContext.SubscriptionID) + + logs, err := containerClient.ListLogs(ctx, aciContext.ResourceGroup, containerGroupName, containerName, nil) + if err != nil { + return "", fmt.Errorf("cannot get container logs: %v", err) + } + return *logs.Content, err +} + func getContainerGroupsClient(subscriptionID string) (containerinstance.ContainerGroupsClient, error) { auth, _ := auth.NewAuthorizerFromCLI() containerGroupsClient := containerinstance.NewContainerGroupsClient(subscriptionID) diff --git a/azure/backend.go b/azure/backend.go index 544e5e9b0..9b0aec7d8 100644 --- a/azure/backend.go +++ b/azure/backend.go @@ -2,6 +2,7 @@ package azure import ( "context" + "fmt" "io" "github.com/Azure/azure-sdk-for-go/services/containerinstance/mgmt/2018-10-01/containerinstance" @@ -137,3 +138,12 @@ func (cs *containerService) Exec(ctx context.Context, name string, command strin writer, ) } + +func (cs *containerService) Logs(ctx context.Context, name string, writer io.Writer, follow bool) error { + logs, err := getACIContainerLogs(ctx, cs.ctx, name, name) + if err != nil { + return err + } + _, err = fmt.Fprint(writer, logs) + return err +} diff --git a/cli/cmd/logs.go b/cli/cmd/logs.go new file mode 100644 index 000000000..739873c8a --- /dev/null +++ b/cli/cmd/logs.go @@ -0,0 +1,39 @@ +package cmd + +import ( + "context" + "os" + + "github.com/docker/api/client" + "github.com/pkg/errors" + "github.com/spf13/cobra" +) + +type logsOpts struct { + Follow bool +} + +func LogsCommand() *cobra.Command { + var opts logsOpts + cmd := &cobra.Command{ + Use: "logs", + Short: "Fetch the logs of a container", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + return runLogs(cmd.Context(), args[0], opts) + }, + } + + cmd.Flags().BoolVarP(&opts.Follow, "follow", "f", false, "Follow log outut") + + return cmd +} + +func runLogs(ctx context.Context, name string, opts logsOpts) error { + c, err := client.New(ctx) + if err != nil { + return errors.Wrap(err, "cannot connect to backend") + } + + return c.ContainerService().Logs(ctx, name, os.Stdout, opts.Follow) +} diff --git a/cli/main.go b/cli/main.go index 7f6e3b7db..7e1f00dab 100644 --- a/cli/main.go +++ b/cli/main.go @@ -102,6 +102,7 @@ func main() { &cmd.ExampleCommand, run.Command(), cmd.ExecCommand(), + cmd.LogsCommand(), ) helpFunc := root.HelpFunc() diff --git a/containers/api.go b/containers/api.go index b4e914214..a0fbb4890 100644 --- a/containers/api.go +++ b/containers/api.go @@ -45,4 +45,6 @@ type ContainerService interface { Run(ctx context.Context, config ContainerConfig) error // Exec executes a command inside a running container Exec(ctx context.Context, containerName string, command string, reader io.Reader, writer io.Writer) error + // Logs returns all the logs of a container + Logs(ctx context.Context, name string, writer io.Writer, follow bool) error } diff --git a/example/backend.go b/example/backend.go index f1ec50220..5b145c5fb 100644 --- a/example/backend.go +++ b/example/backend.go @@ -43,3 +43,8 @@ func (cs *containerService) Exec(ctx context.Context, name string, command strin fmt.Printf("Executing command %q on container %q", command, name) return nil } + +func (cs *containerService) Logs(ctx context.Context, name string, writer io.Writer, follow bool) error { + fmt.Fprintf(writer, "Following logs for container %q", name) + return nil +}