retry_helm_agent.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //go:build ee
  2. package utils
  3. import (
  4. "fmt"
  5. "log"
  6. "os"
  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. "github.com/stefanmcshane/helm/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 {
  46. log.Printf("recreating helm agent for retrying ListReleases. Error: %v", err)
  47. a.agent, err = helm.GetAgentOutOfClusterConfig(a.form, a.l)
  48. if err != nil {
  49. return nil, fmt.Errorf("error recreating helm agent for retrying ListReleases: %w", err)
  50. }
  51. }
  52. time.Sleep(a.retryInterval)
  53. }
  54. return nil, fmt.Errorf("maxiumum number of retries (%d) reached for ListReleases", a.retryCount)
  55. }
  56. func (a *RetryHelmAgent) GetReleaseHistory(
  57. name string,
  58. ) ([]*release.Release, error) {
  59. for i := uint(0); i < a.retryCount; i++ {
  60. releases, err := a.agent.GetReleaseHistory(name)
  61. if err == nil {
  62. return releases, nil
  63. } else {
  64. log.Printf("recreating helm agent for retrying GetReleaseHistory. Error: %v", err)
  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. }
  70. time.Sleep(a.retryInterval)
  71. }
  72. return nil, fmt.Errorf("maxiumum number of retries (%d) reached for GetReleaseHistory", a.retryCount)
  73. }
  74. func (a *RetryHelmAgent) DeleteReleaseRevision(
  75. name string,
  76. version int,
  77. ) error {
  78. for i := uint(0); i < a.retryCount; i++ {
  79. err := a.agent.DeleteReleaseRevision(name, version)
  80. if err == nil {
  81. return nil
  82. } else {
  83. log.Printf("recreating helm agent for retrying DeleteReleaseRevision. Error: %v", err)
  84. a.agent, err = helm.GetAgentOutOfClusterConfig(a.form, a.l)
  85. if err != nil {
  86. return fmt.Errorf("error recreating helm agent for retrying DeleteReleaseRevision: %w", err)
  87. }
  88. }
  89. time.Sleep(a.retryInterval)
  90. }
  91. return fmt.Errorf("maxiumum number of retries (%d) reached for DeleteReleaseRevision", a.retryCount)
  92. }