agent_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package helm_test
  2. import (
  3. "testing"
  4. "helm.sh/helm/v3/pkg/storage/driver"
  5. "github.com/porter-dev/porter/internal/config"
  6. "github.com/porter-dev/porter/internal/helm"
  7. "github.com/porter-dev/porter/internal/logger"
  8. "helm.sh/helm/v3/pkg/chart"
  9. "helm.sh/helm/v3/pkg/release"
  10. )
  11. func newAgentFixture(t *testing.T, namespace string) *helm.Agent {
  12. t.Helper()
  13. l := logger.NewConsole(true)
  14. opts := &helm.Form{
  15. Namespace: namespace,
  16. }
  17. agent, _ := opts.ToAgent(l, &config.HelmGlobalConf{
  18. IsTesting: true,
  19. }, nil)
  20. return agent
  21. }
  22. type releaseStub struct {
  23. name string
  24. namespace string
  25. version int
  26. chartVersion string
  27. status release.Status
  28. }
  29. // makeReleases adds a slice of releases to the configured storage.
  30. func makeReleases(t *testing.T, agent *helm.Agent, rels []releaseStub) {
  31. t.Helper()
  32. storage := agent.ActionConfig.Releases
  33. for _, r := range rels {
  34. rel := &release.Release{
  35. Name: r.name,
  36. Namespace: r.namespace,
  37. Version: r.version,
  38. Info: &release.Info{
  39. Status: r.status,
  40. },
  41. Chart: &chart.Chart{
  42. Metadata: &chart.Metadata{
  43. Version: r.chartVersion,
  44. Icon: "https://example.com/icon.png",
  45. },
  46. },
  47. }
  48. err := storage.Create(rel)
  49. if err != nil {
  50. t.Fatal(err)
  51. }
  52. }
  53. }
  54. func compareReleaseToStubs(t *testing.T, releases []*release.Release, stubs []releaseStub) {
  55. t.Helper()
  56. if len(releases) != len(stubs) {
  57. t.Fatalf("length of release %v doesn't match length of stub %v\n",
  58. len(releases), len(stubs))
  59. }
  60. for i, r := range releases {
  61. if r.Name != stubs[i].name {
  62. t.Errorf("Release name %v doesn't match stub name %v\n",
  63. r.Name, stubs[i].name)
  64. }
  65. if r.Namespace != stubs[i].namespace {
  66. t.Errorf("Release namespace %v doesn't match stub namespace %v\n",
  67. r.Namespace, stubs[i].namespace)
  68. }
  69. if r.Info.Status != stubs[i].status {
  70. t.Errorf("Release namespace %v doesn't match stub namespace %v\n",
  71. r.Info.Status, stubs[i].status)
  72. }
  73. if r.Version != stubs[i].version {
  74. t.Errorf("Release version %v doesn't match stub version %v\n",
  75. r.Version, stubs[i].version)
  76. }
  77. if r.Chart.Metadata.Version != stubs[i].chartVersion {
  78. t.Errorf("Release metadata version %v doesn't match stub chart version %v\n",
  79. r.Chart.Metadata.Version, stubs[i].chartVersion)
  80. }
  81. }
  82. return
  83. }
  84. type listReleaseTest struct {
  85. name string
  86. namespace string
  87. filter *helm.ListFilter
  88. releases []releaseStub
  89. expRes []releaseStub
  90. }
  91. var listReleaseTests = []listReleaseTest{
  92. listReleaseTest{
  93. name: "simple test across namespaces, should sort by name",
  94. namespace: "",
  95. filter: &helm.ListFilter{
  96. Namespace: "",
  97. Limit: 20,
  98. Skip: 0,
  99. ByDate: false,
  100. StatusFilter: []string{"deployed"},
  101. },
  102. releases: []releaseStub{
  103. releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  104. releaseStub{"wordpress", "default", 1, "1.0.1", release.StatusDeployed},
  105. releaseStub{"not-in-default-namespace", "other", 1, "1.0.2", release.StatusDeployed},
  106. },
  107. expRes: []releaseStub{
  108. releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  109. releaseStub{"not-in-default-namespace", "other", 1, "1.0.2", release.StatusDeployed},
  110. releaseStub{"wordpress", "default", 1, "1.0.1", release.StatusDeployed},
  111. },
  112. },
  113. listReleaseTest{
  114. name: "simple test limit",
  115. namespace: "",
  116. filter: &helm.ListFilter{
  117. Namespace: "",
  118. Limit: 2,
  119. Skip: 0,
  120. ByDate: false,
  121. StatusFilter: []string{"deployed"},
  122. },
  123. releases: []releaseStub{
  124. releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  125. releaseStub{"not-in-default-namespace", "other", 1, "1.0.1", release.StatusDeployed},
  126. releaseStub{"wordpress", "default", 1, "1.0.2", release.StatusDeployed},
  127. },
  128. expRes: []releaseStub{
  129. releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  130. releaseStub{"not-in-default-namespace", "other", 1, "1.0.1", release.StatusDeployed},
  131. },
  132. },
  133. }
  134. func TestListReleases(t *testing.T) {
  135. for _, tc := range listReleaseTests {
  136. agent := newAgentFixture(t, tc.namespace)
  137. makeReleases(t, agent, tc.releases)
  138. // calling agent.ActionConfig.Releases.Create in makeReleases will automatically set the
  139. // namespace, so we have to reset the namespace of the storage driver
  140. agent.ActionConfig.Releases.Driver.(*driver.Memory).SetNamespace(tc.namespace)
  141. releases, err := agent.ListReleases(tc.namespace, tc.filter)
  142. if err != nil {
  143. t.Errorf("%v", err)
  144. }
  145. compareReleaseToStubs(t, releases, tc.expRes)
  146. }
  147. }
  148. type getReleaseTest struct {
  149. name string
  150. namespace string
  151. releases []releaseStub
  152. getName string
  153. getVersion int
  154. expRes releaseStub
  155. }
  156. var getReleaseTests = []getReleaseTest{
  157. getReleaseTest{
  158. name: "simple get with revision 0 (latest)",
  159. namespace: "default",
  160. releases: []releaseStub{
  161. releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  162. releaseStub{"wordpress", "default", 1, "1.0.1", release.StatusDeployed},
  163. releaseStub{"not-in-default-namespace", "other", 1, "1.0.2", release.StatusDeployed},
  164. },
  165. getName: "airwatch",
  166. getVersion: 0,
  167. expRes: releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  168. },
  169. }
  170. func TestGetReleases(t *testing.T) {
  171. for _, tc := range getReleaseTests {
  172. agent := newAgentFixture(t, tc.namespace)
  173. makeReleases(t, agent, tc.releases)
  174. // calling agent.ActionConfig.Releases.Create in makeReleases will automatically set the
  175. // namespace, so we have to reset the namespace of the storage driver
  176. agent.ActionConfig.Releases.Driver.(*driver.Memory).SetNamespace(tc.namespace)
  177. rel, err := agent.GetRelease(tc.getName, tc.getVersion)
  178. if err != nil {
  179. t.Errorf("%v", err)
  180. }
  181. compareReleaseToStubs(t, []*release.Release{rel}, []releaseStub{tc.expRes})
  182. }
  183. }