get_logs.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package state
  2. import (
  3. "bufio"
  4. "bytes"
  5. "errors"
  6. "fmt"
  7. "net/http"
  8. "github.com/porter-dev/porter/api/server/shared"
  9. "github.com/porter-dev/porter/api/server/shared/apierrors"
  10. "github.com/porter-dev/porter/api/types"
  11. "github.com/porter-dev/porter/internal/models"
  12. "github.com/porter-dev/porter/provisioner/integrations/storage"
  13. "github.com/porter-dev/porter/provisioner/server/config"
  14. ptypes "github.com/porter-dev/porter/provisioner/types"
  15. )
  16. type LogsGetHandler struct {
  17. Config *config.Config
  18. resultWriter shared.ResultWriter
  19. }
  20. func NewLogsGetHandler(
  21. config *config.Config,
  22. ) *LogsGetHandler {
  23. return &LogsGetHandler{
  24. Config: config,
  25. resultWriter: shared.NewDefaultResultWriter(config.Logger, config.Alerter),
  26. }
  27. }
  28. func (c *LogsGetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  29. // read the infra from the attached scope
  30. infra, _ := r.Context().Value(types.InfraScope).(*models.Infra)
  31. operation, _ := r.Context().Value(types.OperationScope).(*models.Operation)
  32. fileBytes, err := c.Config.StorageManager.ReadFile(
  33. infra,
  34. fmt.Sprintf("%s-%d-%d-%s-%s-logs.txt", infra.Kind, infra.ProjectID, infra.ID, infra.Suffix, operation.UID),
  35. false,
  36. )
  37. if err != nil {
  38. // if the file does not exist yet, return a 404 status code
  39. if errors.Is(err, storage.FileDoesNotExist) {
  40. apierrors.HandleAPIError(c.Config.Logger, c.Config.Alerter, w, r, apierrors.NewErrPassThroughToClient(
  41. fmt.Errorf("current logs file does not exist yet"),
  42. http.StatusNotFound,
  43. ), true)
  44. return
  45. }
  46. apierrors.HandleAPIError(c.Config.Logger, c.Config.Alerter, w, r, apierrors.NewErrInternal(err), true)
  47. return
  48. }
  49. logLines := make([]string, 0)
  50. scanner := bufio.NewScanner(bytes.NewReader(fileBytes))
  51. for scanner.Scan() {
  52. logLines = append(logLines, scanner.Text())
  53. }
  54. resp := &ptypes.GetLogsResponse{
  55. Logs: logLines,
  56. }
  57. c.resultWriter.WriteResult(w, r, resp)
  58. }