forked from toolshed/coop-cloud-backend
87 lines
1.7 KiB
Go
87 lines
1.7 KiB
Go
package cli
|
|
import (
|
|
"context"
|
|
"log"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
appPkg "coopcloud.tech/abra/pkg/app"
|
|
"coop-cloud-backend/cli/status"
|
|
"coopcloud.tech/abra/pkg/client"
|
|
"coopcloud.tech/abra/pkg/upstream/stack"
|
|
|
|
"github.com/docker/docker/api/types"
|
|
|
|
)
|
|
func (h *abraHandler) handleGetLogs(w http.ResponseWriter, r *http.Request, appName string, serviceName string) {
|
|
app, err := appPkg.Get(appName)
|
|
if err != nil {
|
|
log.Printf("error: %s", err)
|
|
return
|
|
}
|
|
stackName := app.StackName()
|
|
|
|
if err := app.Recipe.EnsureExists(); err != nil {
|
|
log.Fatal(err)
|
|
return
|
|
}
|
|
cl, err := client.New(app.Server)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
return
|
|
}
|
|
|
|
deployMeta, err := stack.IsDeployed(context.Background(), cl, stackName)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
return
|
|
}
|
|
|
|
if !deployMeta.IsDeployed {
|
|
log.Printf(fmt.Sprintf("%s is not deployed?", app.Name))
|
|
return
|
|
}
|
|
serviceNames := []string{serviceName}
|
|
|
|
f, err := app.Filters(true, false, serviceNames...)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
ctx := r.Context()
|
|
|
|
services, err := cl.ServiceList(
|
|
context.Background(),
|
|
types.ServiceListOptions{Filters: f},
|
|
)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
return
|
|
}
|
|
|
|
flusher, ok := w.(http.Flusher)
|
|
if !ok {
|
|
http.Error(w, "Streaming unsupported", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "text/event-stream")
|
|
w.Header().Set("Cache-Control", "no-cache")
|
|
w.Header().Set("Connection", "keep-alive")
|
|
|
|
logCh := make (chan string, 50)
|
|
go status.StreamLogs(ctx, cl, services, logCh)
|
|
for {
|
|
select{
|
|
case <- ctx.Done():
|
|
log.Printf("log streaming done")
|
|
return
|
|
case line, ok := <- logCh:
|
|
if !ok {
|
|
return
|
|
}
|
|
fmt.Fprintf(w, "data: %s\n\n", line)
|
|
flusher.Flush()
|
|
}
|
|
}
|
|
}
|