agent_test.go 6.7 KB

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