From 539cbd68a93c9a4c419f1f0ac5712be090a21906 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Sun, 2 May 2021 16:26:23 +0200 Subject: [PATCH] Split run and logs --- app.go | 10 +++++++++- engine/docker/docker.go | 27 ++++++++++++++++++++------- ui/index.html | 10 ++++++---- ui/js/minifass.js | 22 +++++++++++++++++++++- 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/app.go b/app.go index c22e2d1..035a60b 100644 --- a/app.go +++ b/app.go @@ -41,7 +41,15 @@ func NewApp() App { }) router.GET("/api/run", func(c *gin.Context) { - stream, err := docker.RunHello() + ctrid, err := docker.Run("hello-world") + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err}) + } + c.JSON(http.StatusOK, gin.H{"jobid": ctrid}) + }) + + router.GET("/api/jobs/:jobid/logs", func(c *gin.Context) { + stream, err := docker.Logs(c.Param("jobid")) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err}) } diff --git a/engine/docker/docker.go b/engine/docker/docker.go index 3c5a2b0..8a870bf 100644 --- a/engine/docker/docker.go +++ b/engine/docker/docker.go @@ -11,8 +11,12 @@ import ( oci "github.com/opencontainers/image-spec/specs-go/v1" ) +func newCli() (*client.Client, error) { + return client.NewClientWithOpts(client.FromEnv) +} + func Ps() ([]types.Container, error) { - cli, err := client.NewClientWithOpts(client.FromEnv) + cli, err := newCli() if err != nil { return nil, err } @@ -25,10 +29,10 @@ func Ps() ([]types.Container, error) { return containers, nil } -func RunHello() (io.ReadCloser, error) { - cli, err := client.NewClientWithOpts(client.FromEnv) +func Run(image string) (string, error) { + cli, err := newCli() if err != nil { - return nil, err + return "", err } ctnr, err := cli.ContainerCreate( @@ -36,7 +40,7 @@ func RunHello() (io.ReadCloser, error) { &container.Config{ AttachStdout: true, AttachStderr: true, - Image: "hello-world", + Image: image, }, &container.HostConfig{}, &network.NetworkingConfig{}, @@ -47,15 +51,24 @@ func RunHello() (io.ReadCloser, error) { "", ) if err != nil { - return nil, err + return "", err } err = cli.ContainerStart(context.Background(), ctnr.ID, types.ContainerStartOptions{}) + if err != nil { + return "", err + } + + return ctnr.ID, nil +} + +func Logs(id string) (io.ReadCloser, error) { + cli, err := newCli() if err != nil { return nil, err } - return cli.ContainerLogs(context.Background(), ctnr.ID, types.ContainerLogsOptions{ + return cli.ContainerLogs(context.Background(), id, types.ContainerLogsOptions{ ShowStdout: true, ShowStderr: true, Follow: true, diff --git a/ui/index.html b/ui/index.html index f889398..3df9d7e 100644 --- a/ui/index.html +++ b/ui/index.html @@ -18,14 +18,16 @@ + + diff --git a/ui/js/minifass.js b/ui/js/minifass.js index 4de9d72..3dfe7e7 100644 --- a/ui/js/minifass.js +++ b/ui/js/minifass.js @@ -8,19 +8,39 @@ function getVersion() { }); } +let current_job = null; + function runctnr() { document.getElementById("btnlaunch").disabled = true; document.getElementById("btnlaunchspinner").style.display = "inline-block"; fetch('/api/run') + .then(function(response) { + return response.json(); + }) + .then(function(data) { + current_job = data.jobid; + + document.getElementById("jobid").textContent = current_job; + document.getElementById("started-alert").style.display = "block"; + + fetchLogs(); + }) + return false; +} + +function fetchLogs() { + fetch('/api/jobs/' + current_job + '/logs') .then(function(response) { document.getElementById("btnlaunch").disabled = false; document.getElementById("btnlaunchspinner").style.display = "none"; + document.getElementById("started-alert").style.display = "none"; + return response.text(); }) .then(function(logs) { document.getElementById("logs").textContent = logs; document.getElementById("logs-card").style.display = "block"; + current_job = null; }) - return false; }