app_status.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package v2
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "time"
  7. "github.com/fatih/color"
  8. api "github.com/porter-dev/porter/api/client"
  9. "github.com/porter-dev/porter/api/server/handlers/porter_app"
  10. )
  11. const (
  12. // DefaultWaitTimeoutMinutes is the default timeout for waiting for an update-image to complete
  13. DefaultWaitTimeoutMinutes = 10
  14. // DefaultRetryFrequencySeconds is the default frequency for checking the status of an update-image
  15. DefaultRetryFrequencySeconds = 10
  16. )
  17. // waitForAppRevisionStatusInput is the input for the WaitForAppRevisionStatus function
  18. type waitForAppRevisionStatusInput struct {
  19. ProjectID uint
  20. ClusterID uint
  21. AppName string
  22. RevisionID string
  23. Client api.Client
  24. }
  25. // waitForAppRevisionStatus waits for an app revision to complete
  26. func waitForAppRevisionStatus(ctx context.Context, input waitForAppRevisionStatusInput) error {
  27. timeoutMinutes := DefaultWaitTimeoutMinutes
  28. timeout := time.Duration(timeoutMinutes) * time.Minute
  29. deadline := time.Now().Add(timeout)
  30. color.New(color.FgBlue).Printf("Waiting up to %d minutes for all services to deploy\n", timeoutMinutes) // nolint:errcheck,gosec
  31. var status porter_app.HighLevelStatus
  32. for time.Now().Before(deadline) {
  33. statusResp, err := input.Client.GetRevisionStatus(ctx, input.ProjectID, input.ClusterID, input.AppName, input.RevisionID)
  34. if err != nil {
  35. return fmt.Errorf("error getting app revision status: %w", err)
  36. }
  37. if statusResp == nil {
  38. return errors.New("unable to determine status of app revision")
  39. }
  40. status = statusResp.HighLevelStatus
  41. if status != porter_app.HighLevelStatus_Progressing {
  42. break
  43. }
  44. time.Sleep(DefaultRetryFrequencySeconds * time.Second)
  45. }
  46. switch status {
  47. case porter_app.HighLevelStatus_Progressing:
  48. return fmt.Errorf("timeout exceeded")
  49. case porter_app.HighLevelStatus_Successful:
  50. _, _ = color.New(color.FgGreen).Printf("All services deployed successfully\n") // nolint:errcheck,gosec
  51. return nil
  52. case porter_app.HighLevelStatus_Failed:
  53. return fmt.Errorf("update failed: check dashboard for details")
  54. default:
  55. return fmt.Errorf("received unknown status: %s", status)
  56. }
  57. }