retry_helm_agent.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. ctx context.Context,
  23. form *helm.Form,
  24. l *logger.Logger,
  25. retryCount uint,
  26. retryInterval time.Duration,
  27. ) (*RetryHelmAgent, error) {
  28. if l == nil {
  29. l = logger.New(true, os.Stdout)
  30. }
  31. helmAgent, err := helm.GetAgentOutOfClusterConfig(ctx, form, l)
  32. if err != nil {
  33. return nil, err
  34. }
  35. return &RetryHelmAgent{
  36. form, l, helmAgent, retryCount, retryInterval,
  37. }, nil
  38. }
  39. func (a *RetryHelmAgent) ListReleases(
  40. ctx context.Context,
  41. namespace string,
  42. filter *types.ReleaseListFilter,
  43. ) ([]*release.Release, error) {
  44. for i := uint(0); i < a.retryCount; i++ {
  45. releases, err := a.agent.ListReleases(ctx, namespace, filter)
  46. if err == nil {
  47. return releases, nil
  48. } else {
  49. log.Printf("recreating helm agent for retrying ListReleases. Error: %v", err)
  50. a.agent, err = helm.GetAgentOutOfClusterConfig(ctx, a.form, a.l)
  51. if err != nil {
  52. return nil, fmt.Errorf("error recreating helm agent for retrying ListReleases: %w", err)
  53. }
  54. }
  55. time.Sleep(a.retryInterval)
  56. }
  57. return nil, fmt.Errorf("maxiumum number of retries (%d) reached for ListReleases", a.retryCount)
  58. }
  59. func (a *RetryHelmAgent) GetReleaseHistory(
  60. ctx context.Context,
  61. name string,
  62. ) ([]*release.Release, error) {
  63. for i := uint(0); i < a.retryCount; i++ {
  64. releases, err := a.agent.GetReleaseHistory(ctx, name)
  65. if err == nil {
  66. return releases, nil
  67. } else {
  68. log.Printf("recreating helm agent for retrying GetReleaseHistory. Error: %v", err)
  69. a.agent, err = helm.GetAgentOutOfClusterConfig(ctx, a.form, a.l)
  70. if err != nil {
  71. return nil, fmt.Errorf("error recreating helm agent for retrying GetReleaseHistory: %w", err)
  72. }
  73. }
  74. time.Sleep(a.retryInterval)
  75. }
  76. return nil, fmt.Errorf("maxiumum number of retries (%d) reached for GetReleaseHistory", a.retryCount)
  77. }
  78. func (a *RetryHelmAgent) DeleteReleaseRevision(
  79. ctx context.Context,
  80. name string,
  81. version int,
  82. ) error {
  83. for i := uint(0); i < a.retryCount; i++ {
  84. err := a.agent.DeleteReleaseRevision(ctx, name, version)
  85. if err == nil {
  86. return nil
  87. } else {
  88. log.Printf("recreating helm agent for retrying DeleteReleaseRevision. Error: %v", err)
  89. a.agent, err = helm.GetAgentOutOfClusterConfig(ctx, a.form, a.l)
  90. if err != nil {
  91. return fmt.Errorf("error recreating helm agent for retrying DeleteReleaseRevision: %w", err)
  92. }
  93. }
  94. time.Sleep(a.retryInterval)
  95. }
  96. return fmt.Errorf("maxiumum number of retries (%d) reached for DeleteReleaseRevision", a.retryCount)
  97. }