retry_helm_agent.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. //go:build ee
  2. package utils
  3. import (
  4. "context"
  5. "fmt"
  6. "log"
  7. "os"
  8. "time"
  9. "github.com/porter-dev/porter/api/types"
  10. "github.com/porter-dev/porter/internal/helm"
  11. "github.com/porter-dev/porter/pkg/logger"
  12. "github.com/stefanmcshane/helm/pkg/release"
  13. )
  14. type RetryHelmAgent struct {
  15. form *helm.Form
  16. l *logger.Logger
  17. agent *helm.Agent
  18. retryCount uint
  19. retryInterval time.Duration
  20. }
  21. func NewRetryHelmAgent(
  22. form *helm.Form,
  23. l *logger.Logger,
  24. retryCount uint,
  25. retryInterval time.Duration,
  26. ) (*RetryHelmAgent, error) {
  27. if l == nil {
  28. l = logger.New(true, os.Stdout)
  29. }
  30. helmAgent, err := helm.GetAgentOutOfClusterConfig(form, l)
  31. if err != nil {
  32. return nil, err
  33. }
  34. return &RetryHelmAgent{
  35. form, l, helmAgent, retryCount, retryInterval,
  36. }, nil
  37. }
  38. func (a *RetryHelmAgent) ListReleases(
  39. ctx context.Context,
  40. namespace string,
  41. filter *types.ReleaseListFilter,
  42. ) ([]*release.Release, error) {
  43. for i := uint(0); i < a.retryCount; i++ {
  44. releases, err := a.agent.ListReleases(ctx, namespace, filter)
  45. if err == nil {
  46. return releases, nil
  47. } else {
  48. log.Printf("recreating helm agent for retrying ListReleases. Error: %v", err)
  49. a.agent, err = helm.GetAgentOutOfClusterConfig(a.form, a.l)
  50. if err != nil {
  51. return nil, fmt.Errorf("error recreating helm agent for retrying ListReleases: %w", err)
  52. }
  53. }
  54. time.Sleep(a.retryInterval)
  55. }
  56. return nil, fmt.Errorf("maxiumum number of retries (%d) reached for ListReleases", a.retryCount)
  57. }
  58. func (a *RetryHelmAgent) GetReleaseHistory(
  59. ctx context.Context,
  60. name string,
  61. ) ([]*release.Release, error) {
  62. for i := uint(0); i < a.retryCount; i++ {
  63. releases, err := a.agent.GetReleaseHistory(ctx, name)
  64. if err == nil {
  65. return releases, nil
  66. } else {
  67. log.Printf("recreating helm agent for retrying GetReleaseHistory. Error: %v", err)
  68. a.agent, err = helm.GetAgentOutOfClusterConfig(a.form, a.l)
  69. if err != nil {
  70. return nil, fmt.Errorf("error recreating helm agent for retrying GetReleaseHistory: %w", err)
  71. }
  72. }
  73. time.Sleep(a.retryInterval)
  74. }
  75. return nil, fmt.Errorf("maxiumum number of retries (%d) reached for GetReleaseHistory", a.retryCount)
  76. }
  77. func (a *RetryHelmAgent) DeleteReleaseRevision(
  78. ctx context.Context,
  79. name string,
  80. version int,
  81. ) error {
  82. for i := uint(0); i < a.retryCount; i++ {
  83. err := a.agent.DeleteReleaseRevision(ctx, name, version)
  84. if err == nil {
  85. return nil
  86. } else {
  87. log.Printf("recreating helm agent for retrying DeleteReleaseRevision. Error: %v", err)
  88. a.agent, err = helm.GetAgentOutOfClusterConfig(a.form, a.l)
  89. if err != nil {
  90. return fmt.Errorf("error recreating helm agent for retrying DeleteReleaseRevision: %w", err)
  91. }
  92. }
  93. time.Sleep(a.retryInterval)
  94. }
  95. return fmt.Errorf("maxiumum number of retries (%d) reached for DeleteReleaseRevision", a.retryCount)
  96. }