2
0

agent_test.go 9.7 KB

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