agent_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package helm_test
  2. import (
  3. "io/ioutil"
  4. "testing"
  5. "github.com/porter-dev/porter/internal/helm"
  6. "github.com/porter-dev/porter/internal/logger"
  7. "helm.sh/helm/v3/pkg/action"
  8. "helm.sh/helm/v3/pkg/chart"
  9. "helm.sh/helm/v3/pkg/chartutil"
  10. kubefake "helm.sh/helm/v3/pkg/kube/fake"
  11. "helm.sh/helm/v3/pkg/release"
  12. "helm.sh/helm/v3/pkg/storage"
  13. "helm.sh/helm/v3/pkg/storage/driver"
  14. )
  15. func newActionConfigFixture(t *testing.T) *action.Configuration {
  16. t.Helper()
  17. l := logger.NewConsole(true)
  18. return &action.Configuration{
  19. Releases: storage.Init(driver.NewMemory()),
  20. KubeClient: &kubefake.FailingKubeClient{
  21. PrintingKubeClient: kubefake.PrintingKubeClient{
  22. Out: ioutil.Discard,
  23. },
  24. },
  25. Capabilities: chartutil.DefaultCapabilities,
  26. Log: l.Printf,
  27. }
  28. }
  29. type releaseStub struct {
  30. name string
  31. namespace string
  32. version int
  33. chartVersion string
  34. status release.Status
  35. }
  36. // makeReleases adds a slice of releases to the configured storage.
  37. func makeReleases(t *testing.T, actionConfig *action.Configuration, rels []releaseStub) {
  38. t.Helper()
  39. storage := actionConfig.Releases
  40. for _, r := range rels {
  41. rel := &release.Release{
  42. Name: r.name,
  43. Namespace: r.namespace,
  44. Version: r.version,
  45. Info: &release.Info{
  46. Status: r.status,
  47. },
  48. Chart: &chart.Chart{
  49. Metadata: &chart.Metadata{
  50. Version: r.chartVersion,
  51. Icon: "https://example.com/icon.png",
  52. },
  53. },
  54. }
  55. err := storage.Create(rel)
  56. if err != nil {
  57. t.Fatal(err)
  58. }
  59. }
  60. }
  61. func compareReleaseToStubs(t *testing.T, releases []*release.Release, stubs []releaseStub) {
  62. t.Helper()
  63. if len(releases) != len(stubs) {
  64. t.Fatalf("length of release %v doesn't match length of stub %v\n",
  65. len(releases), len(stubs))
  66. }
  67. for i, r := range releases {
  68. if r.Name != stubs[i].name {
  69. t.Errorf("Release name %v doesn't match stub name %v\n",
  70. r.Name, stubs[i].name)
  71. }
  72. if r.Namespace != stubs[i].namespace {
  73. t.Errorf("Release namespace %v doesn't match stub namespace %v\n",
  74. r.Namespace, stubs[i].namespace)
  75. }
  76. if r.Info.Status != stubs[i].status {
  77. t.Errorf("Release namespace %v doesn't match stub namespace %v\n",
  78. r.Info.Status, stubs[i].status)
  79. }
  80. if r.Version != stubs[i].version {
  81. t.Errorf("Release version %v doesn't match stub version %v\n",
  82. r.Version, stubs[i].version)
  83. }
  84. if r.Chart.Metadata.Version != stubs[i].chartVersion {
  85. t.Errorf("Release metadata version %v doesn't match stub chart version %v\n",
  86. r.Chart.Metadata.Version, stubs[i].chartVersion)
  87. }
  88. }
  89. return
  90. }
  91. type listReleaseTest struct {
  92. name string
  93. namespace string
  94. filter *helm.ListFilter
  95. releases []releaseStub
  96. expRes []releaseStub
  97. }
  98. var listReleaseTests = []listReleaseTest{
  99. listReleaseTest{
  100. name: "simple test across namespaces, should sort by name",
  101. namespace: "",
  102. filter: &helm.ListFilter{
  103. Namespace: "",
  104. Limit: 20,
  105. Skip: 0,
  106. ByDate: false,
  107. StatusFilter: []string{"deployed"},
  108. },
  109. releases: []releaseStub{
  110. releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  111. releaseStub{"wordpress", "default", 1, "1.0.1", release.StatusDeployed},
  112. releaseStub{"not-in-default-namespace", "other", 1, "1.0.2", release.StatusDeployed},
  113. },
  114. expRes: []releaseStub{
  115. releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  116. releaseStub{"not-in-default-namespace", "other", 1, "1.0.2", release.StatusDeployed},
  117. releaseStub{"wordpress", "default", 1, "1.0.1", release.StatusDeployed},
  118. },
  119. },
  120. listReleaseTest{
  121. name: "simple test limit",
  122. namespace: "",
  123. filter: &helm.ListFilter{
  124. Namespace: "",
  125. Limit: 2,
  126. Skip: 0,
  127. ByDate: false,
  128. StatusFilter: []string{"deployed"},
  129. },
  130. releases: []releaseStub{
  131. releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  132. releaseStub{"not-in-default-namespace", "other", 1, "1.0.1", release.StatusDeployed},
  133. releaseStub{"wordpress", "default", 1, "1.0.2", release.StatusDeployed},
  134. },
  135. expRes: []releaseStub{
  136. releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  137. releaseStub{"not-in-default-namespace", "other", 1, "1.0.1", release.StatusDeployed},
  138. },
  139. },
  140. }
  141. func TestListReleases(t *testing.T) {
  142. for _, tc := range listReleaseTests {
  143. actionConfig := newActionConfigFixture(t)
  144. makeReleases(t, actionConfig, tc.releases)
  145. actionConfig.Releases.Driver.(*driver.Memory).SetNamespace(tc.namespace)
  146. releases, err := helm.ListReleases(actionConfig, tc.namespace, tc.filter)
  147. if err != nil {
  148. t.Errorf("%v", err)
  149. }
  150. compareReleaseToStubs(t, releases, tc.expRes)
  151. }
  152. }