agent_test.go 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. package helm_test
  2. import (
  3. "testing"
  4. "github.com/stefanmcshane/helm/pkg/storage/driver"
  5. "github.com/porter-dev/porter/api/types"
  6. "github.com/porter-dev/porter/internal/helm"
  7. "github.com/porter-dev/porter/pkg/logger"
  8. "github.com/stefanmcshane/helm/pkg/chart"
  9. "github.com/stefanmcshane/helm/pkg/release"
  10. )
  11. func newAgentFixture(t *testing.T, namespace string) *helm.Agent {
  12. t.Helper()
  13. l := logger.NewConsole(true)
  14. form := &helm.Form{
  15. Namespace: namespace,
  16. }
  17. return helm.GetAgentTesting(form, nil, l, nil)
  18. }
  19. type releaseStub struct {
  20. name string
  21. namespace string
  22. version int
  23. chartVersion string
  24. status release.Status
  25. }
  26. // makeReleases adds a slice of releases to the configured storage.
  27. func makeReleases(t *testing.T, agent *helm.Agent, rels []releaseStub) {
  28. t.Helper()
  29. storage := agent.ActionConfig.Releases
  30. for _, r := range rels {
  31. rel := &release.Release{
  32. Name: r.name,
  33. Namespace: r.namespace,
  34. Version: r.version,
  35. Info: &release.Info{
  36. Status: r.status,
  37. },
  38. Chart: &chart.Chart{
  39. Metadata: &chart.Metadata{
  40. Version: r.chartVersion,
  41. Icon: "https://example.com/icon.png",
  42. },
  43. },
  44. }
  45. err := storage.Create(rel)
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. }
  50. }
  51. func compareReleaseToStubs(t *testing.T, releases []*release.Release, stubs []releaseStub) {
  52. t.Helper()
  53. if len(releases) != len(stubs) {
  54. t.Fatalf("length of release %v doesn't match length of stub %v\n",
  55. len(releases), len(stubs))
  56. }
  57. for i, r := range releases {
  58. if r.Name != stubs[i].name {
  59. t.Errorf("Release name %v doesn't match stub name %v\n",
  60. r.Name, stubs[i].name)
  61. }
  62. if r.Namespace != stubs[i].namespace {
  63. t.Errorf("Release namespace %v doesn't match stub namespace %v\n",
  64. r.Namespace, stubs[i].namespace)
  65. }
  66. if r.Info.Status != stubs[i].status {
  67. t.Errorf("Release namespace %v doesn't match stub namespace %v\n",
  68. r.Info.Status, stubs[i].status)
  69. }
  70. if r.Version != stubs[i].version {
  71. t.Errorf("Release version %v doesn't match stub version %v\n",
  72. r.Version, stubs[i].version)
  73. }
  74. if r.Chart.Metadata.Version != stubs[i].chartVersion {
  75. t.Errorf("Release metadata version %v doesn't match stub chart version %v\n",
  76. r.Chart.Metadata.Version, stubs[i].chartVersion)
  77. }
  78. }
  79. return
  80. }
  81. type listReleaseTest struct {
  82. name string
  83. namespace string
  84. filter *types.ReleaseListFilter
  85. releases []releaseStub
  86. expRes []releaseStub
  87. }
  88. // var listReleaseTests = []listReleaseTest{
  89. // {
  90. // name: "simple test across namespaces, should sort by name",
  91. // namespace: "",
  92. // filter: &types.ReleaseListFilter{
  93. // Namespace: "",
  94. // Limit: 20,
  95. // Skip: 0,
  96. // ByDate: false,
  97. // StatusFilter: []string{"deployed"},
  98. // },
  99. // releases: []releaseStub{
  100. // {"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  101. // {"wordpress", "default", 1, "1.0.1", release.StatusDeployed},
  102. // {"not-in-default-namespace", "other", 1, "1.0.2", release.StatusDeployed},
  103. // },
  104. // expRes: []releaseStub{
  105. // {"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  106. // {"not-in-default-namespace", "other", 1, "1.0.2", release.StatusDeployed},
  107. // {"wordpress", "default", 1, "1.0.1", release.StatusDeployed},
  108. // },
  109. // },
  110. // {
  111. // name: "simple test only default namespace",
  112. // namespace: "default",
  113. // filter: &types.ReleaseListFilter{
  114. // Namespace: "",
  115. // Limit: 20,
  116. // Skip: 0,
  117. // ByDate: false,
  118. // StatusFilter: []string{"deployed"},
  119. // },
  120. // releases: []releaseStub{
  121. // {"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  122. // {"wordpress", "default", 1, "1.0.1", release.StatusDeployed},
  123. // {"not-in-default-namespace", "other", 1, "1.0.2", release.StatusDeployed},
  124. // },
  125. // expRes: []releaseStub{
  126. // {"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  127. // {"wordpress", "default", 1, "1.0.1", release.StatusDeployed},
  128. // },
  129. // },
  130. // {
  131. // name: "simple test limit",
  132. // namespace: "",
  133. // filter: &types.ReleaseListFilter{
  134. // Namespace: "",
  135. // Limit: 2,
  136. // Skip: 0,
  137. // ByDate: false,
  138. // StatusFilter: []string{"deployed"},
  139. // },
  140. // releases: []releaseStub{
  141. // {"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  142. // {"not-in-default-namespace", "other", 1, "1.0.1", release.StatusDeployed},
  143. // {"wordpress", "default", 1, "1.0.2", release.StatusDeployed},
  144. // },
  145. // expRes: []releaseStub{
  146. // {"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  147. // {"not-in-default-namespace", "other", 1, "1.0.1", release.StatusDeployed},
  148. // },
  149. // },
  150. // }
  151. // func TestListReleases(t *testing.T) {
  152. // for _, tc := range listReleaseTests {
  153. // agent := newAgentFixture(t, tc.namespace)
  154. // makeReleases(t, agent, tc.releases)
  155. // // calling agent.ActionConfig.Releases.Create in makeReleases will automatically set the
  156. // // namespace, so we have to reset the namespace of the storage driver
  157. // agent.ActionConfig.Releases.Driver.(*driver.Memory).SetNamespace(tc.namespace)
  158. // releases, err := agent.ListReleases(tc.namespace, tc.filter)
  159. // if err != nil {
  160. // t.Errorf("%v", err)
  161. // }
  162. // compareReleaseToStubs(t, releases, tc.expRes)
  163. // }
  164. // }
  165. type getReleaseTest struct {
  166. name string
  167. namespace string
  168. releases []releaseStub
  169. getName string
  170. getVersion int
  171. expRes releaseStub
  172. }
  173. var getReleaseTests = []getReleaseTest{
  174. {
  175. name: "simple get with revision 0 (latest)",
  176. namespace: "default",
  177. releases: []releaseStub{
  178. {"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  179. {"wordpress", "default", 1, "1.0.1", release.StatusDeployed},
  180. {"not-in-default-namespace", "other", 1, "1.0.2", release.StatusDeployed},
  181. },
  182. getName: "airwatch",
  183. getVersion: 1,
  184. expRes: releaseStub{"airwatch", "default", 1, "1.0.0", release.StatusDeployed},
  185. },
  186. }
  187. func TestGetReleases(t *testing.T) {
  188. for _, tc := range getReleaseTests {
  189. agent := newAgentFixture(t, tc.namespace)
  190. makeReleases(t, agent, tc.releases)
  191. // calling agent.ActionConfig.Releases.Create in makeReleases will automatically set the
  192. // namespace, so we have to reset the namespace of the storage driver
  193. agent.ActionConfig.Releases.Driver.(*driver.Memory).SetNamespace(tc.namespace)
  194. rel, err := agent.GetRelease(tc.getName, tc.getVersion, false)
  195. if err != nil {
  196. t.Errorf("%v", err)
  197. }
  198. compareReleaseToStubs(t, []*release.Release{rel}, []releaseStub{tc.expRes})
  199. }
  200. }
  201. var listReleaseHistoryTests = []listReleaseTest{
  202. {
  203. name: "simple history test",
  204. namespace: "default",
  205. releases: []releaseStub{
  206. {"wordpress", "default", 2, "1.0.2", release.StatusDeployed},
  207. {"wordpress", "default", 1, "1.0.1", release.StatusSuperseded},
  208. },
  209. expRes: []releaseStub{
  210. {"wordpress", "default", 1, "1.0.1", release.StatusSuperseded},
  211. {"wordpress", "default", 2, "1.0.2", release.StatusDeployed},
  212. },
  213. },
  214. }
  215. func TestListReleaseHistory(t *testing.T) {
  216. for _, tc := range listReleaseHistoryTests {
  217. agent := newAgentFixture(t, tc.namespace)
  218. makeReleases(t, agent, tc.releases)
  219. // calling agent.ActionConfig.Releases.Create in makeReleases will automatically set the
  220. // namespace, so we have to reset the namespace of the storage driver
  221. agent.ActionConfig.Releases.Driver.(*driver.Memory).SetNamespace(tc.namespace)
  222. releases, err := agent.GetReleaseHistory("wordpress")
  223. if err != nil {
  224. t.Errorf("%v", err)
  225. }
  226. compareReleaseToStubs(t, releases, tc.expRes)
  227. }
  228. }
  229. var upgradeTests = []listReleaseTest{
  230. {
  231. name: "simple history test",
  232. namespace: "default",
  233. releases: []releaseStub{
  234. {"wordpress", "default", 2, "1.0.2", release.StatusDeployed},
  235. {"wordpress", "default", 1, "1.0.1", release.StatusSuperseded},
  236. },
  237. expRes: []releaseStub{
  238. {"wordpress", "default", 1, "1.0.1", release.StatusSuperseded},
  239. {"wordpress", "default", 2, "1.0.2", release.StatusSuperseded},
  240. {"wordpress", "default", 3, "1.0.2", release.StatusDeployed},
  241. },
  242. },
  243. }
  244. // func TestUpgradeRelease(t *testing.T) {
  245. // for _, tc := range upgradeTests {
  246. // agent := newAgentFixture(t, tc.namespace)
  247. // makeReleases(t, agent, tc.releases)
  248. // // calling agent.ActionConfig.Releases.Create in makeReleases will automatically set the
  249. // // namespace, so we have to reset the namespace of the storage driver
  250. // agent.ActionConfig.Releases.Driver.(*driver.Memory).SetNamespace(tc.namespace)
  251. // agent.UpgradeRelease("wordpress", "", &oauth2.Config{})
  252. // releases, err := agent.GetReleaseHistory("wordpress")
  253. // if err != nil {
  254. // t.Errorf("%v", err)
  255. // }
  256. // compareReleaseToStubs(t, releases, tc.expRes)
  257. // }
  258. // }
  259. var rollbackReleaseTests = []getReleaseTest{
  260. {
  261. name: "simple rollback test",
  262. namespace: "default",
  263. releases: []releaseStub{
  264. {"wordpress", "default", 2, "1.0.2", release.StatusDeployed},
  265. {"wordpress", "default", 1, "1.0.1", release.StatusSuperseded},
  266. },
  267. getName: "wordpress",
  268. getVersion: 3,
  269. expRes: releaseStub{"wordpress", "default", 3, "1.0.1", release.StatusDeployed},
  270. },
  271. }
  272. func TestRollbackRelease(t *testing.T) {
  273. for _, tc := range rollbackReleaseTests {
  274. agent := newAgentFixture(t, tc.namespace)
  275. makeReleases(t, agent, tc.releases)
  276. // calling agent.ActionConfig.Releases.Create in makeReleases will automatically set the
  277. // namespace, so we have to reset the namespace of the storage driver
  278. agent.ActionConfig.Releases.Driver.(*driver.Memory).SetNamespace(tc.namespace)
  279. err := agent.RollbackRelease("wordpress", 1)
  280. if err != nil {
  281. t.Errorf("%v", err)
  282. }
  283. rel, err := agent.GetRelease(tc.getName, tc.getVersion, false)
  284. if err != nil {
  285. t.Errorf("%v", err)
  286. }
  287. compareReleaseToStubs(t, []*release.Release{rel}, []releaseStub{tc.expRes})
  288. }
  289. }