retry_helm_agent.go 2.7 KB

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