helpers_test.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. package stable_source_config_id_population_test
  2. import (
  3. "fmt"
  4. "os"
  5. "testing"
  6. "time"
  7. "github.com/porter-dev/porter/api/server/shared/config/env"
  8. "github.com/porter-dev/porter/api/types"
  9. "github.com/porter-dev/porter/internal/adapter"
  10. "github.com/porter-dev/porter/internal/encryption"
  11. "github.com/porter-dev/porter/internal/models"
  12. ints "github.com/porter-dev/porter/internal/models/integrations"
  13. "github.com/porter-dev/porter/internal/repository"
  14. "github.com/porter-dev/porter/internal/repository/gorm"
  15. _gorm "gorm.io/gorm"
  16. )
  17. type tester struct {
  18. Key *[32]byte
  19. DB *_gorm.DB
  20. repo repository.Repository
  21. dbFileName string
  22. key *[32]byte
  23. initUsers []*models.User
  24. initProjects []*models.Project
  25. initClusters []*models.Cluster
  26. initKIs []*ints.KubeIntegration
  27. initStacks []*models.Stack
  28. }
  29. func setupTestEnv(tester *tester, t *testing.T) {
  30. t.Helper()
  31. db, err := adapter.New(&env.DBConf{
  32. EncryptionKey: "__random_strong_encryption_key__",
  33. SQLLite: true,
  34. SQLLitePath: tester.dbFileName,
  35. })
  36. if err != nil {
  37. t.Fatalf("%\n", err)
  38. }
  39. err = db.AutoMigrate(
  40. &models.Project{},
  41. &models.User{},
  42. &models.Cluster{},
  43. &models.Stack{},
  44. &models.StackEnvGroup{},
  45. &models.StackSourceConfig{},
  46. &models.StackRevision{},
  47. &models.StackResource{},
  48. &ints.KubeIntegration{},
  49. &ints.ClusterTokenCache{},
  50. )
  51. if err != nil {
  52. t.Fatalf("%v\n", err)
  53. }
  54. var key [32]byte
  55. for i, b := range []byte("__random_strong_encryption_key__") {
  56. key[i] = b
  57. }
  58. tester.key = &key
  59. tester.Key = &key
  60. tester.DB = db
  61. tester.repo = gorm.NewRepository(db, &key, nil)
  62. }
  63. func cleanup(tester *tester, t *testing.T) {
  64. t.Helper()
  65. // remove the created file file
  66. os.Remove(tester.dbFileName)
  67. }
  68. func initUser(tester *tester, t *testing.T) {
  69. t.Helper()
  70. user := &models.User{
  71. Email: "example@example.com",
  72. Password: "hello1234",
  73. }
  74. user, err := tester.repo.User().CreateUser(user)
  75. if err != nil {
  76. t.Fatalf("%v\n", err)
  77. }
  78. tester.initUsers = append(tester.initUsers, user)
  79. }
  80. func initCluster(tester *tester, t *testing.T) {
  81. t.Helper()
  82. if len(tester.initProjects) == 0 {
  83. initProject(tester, t)
  84. }
  85. if len(tester.initKIs) == 0 {
  86. initKubeIntegration(tester, t)
  87. }
  88. cluster := &models.Cluster{
  89. ProjectID: tester.initProjects[0].ID,
  90. Name: "cluster-test",
  91. Server: "https://localhost",
  92. KubeIntegrationID: tester.initKIs[0].ID,
  93. CertificateAuthorityData: []byte("-----BEGIN"),
  94. TokenCache: ints.ClusterTokenCache{
  95. TokenCache: ints.TokenCache{
  96. Token: []byte("token-1"),
  97. Expiry: time.Now().Add(-1 * time.Hour),
  98. },
  99. },
  100. }
  101. cluster, err := tester.repo.Cluster().CreateCluster(cluster)
  102. if err != nil {
  103. t.Fatalf("%v\n", err)
  104. }
  105. tester.initClusters = append(tester.initClusters, cluster)
  106. }
  107. func initProject(tester *tester, t *testing.T) {
  108. t.Helper()
  109. proj := &models.Project{
  110. Name: "project-test",
  111. }
  112. proj, err := tester.repo.Project().CreateProject(proj)
  113. if err != nil {
  114. t.Fatalf("%v\n", err)
  115. }
  116. tester.initProjects = append(tester.initProjects, proj)
  117. }
  118. func initKubeIntegration(tester *tester, t *testing.T) {
  119. t.Helper()
  120. if len(tester.initProjects) == 0 {
  121. initProject(tester, t)
  122. }
  123. if len(tester.initUsers) == 0 {
  124. initUser(tester, t)
  125. }
  126. ki := &ints.KubeIntegration{
  127. Mechanism: ints.KubeLocal,
  128. ProjectID: tester.initProjects[0].ID,
  129. UserID: tester.initUsers[0].ID,
  130. Kubeconfig: []byte("current-context: testing\n"),
  131. ClientCertificateData: []byte("clientcertdata"),
  132. ClientKeyData: []byte("clientkeydata"),
  133. Token: []byte("token"),
  134. Username: []byte("username"),
  135. Password: []byte("password"),
  136. }
  137. ki, err := tester.repo.KubeIntegration().CreateKubeIntegration(ki)
  138. if err != nil {
  139. t.Fatalf("%v\n", err)
  140. }
  141. tester.initKIs = append(tester.initKIs, ki)
  142. }
  143. func initStack(tester *tester, t *testing.T, stackName string) {
  144. t.Helper()
  145. if len(tester.initProjects) == 0 {
  146. initProject(tester, t)
  147. }
  148. if len(tester.initUsers) == 0 {
  149. initUser(tester, t)
  150. }
  151. if len(tester.initClusters) == 0 {
  152. initCluster(tester, t)
  153. }
  154. uid, _ := encryption.GenerateRandomBytes(16)
  155. sourceConfigs := []models.StackSourceConfig{
  156. {
  157. Name: "source-config-1",
  158. ImageRepoURI: "some-repo",
  159. ImageTag: "some-tag",
  160. UID: uid,
  161. },
  162. }
  163. // write stack to the database with creating status
  164. stack := &models.Stack{
  165. ProjectID: tester.initProjects[0].ID,
  166. ClusterID: tester.initClusters[0].ID,
  167. Namespace: "test-namespace",
  168. Name: stackName,
  169. UID: uid,
  170. Revisions: []models.StackRevision{
  171. {
  172. RevisionNumber: 1,
  173. Status: string(types.StackRevisionStatusDeploying),
  174. SourceConfigs: sourceConfigs,
  175. },
  176. },
  177. }
  178. newStack, err := tester.repo.Stack().CreateStack(stack)
  179. if err != nil {
  180. t.Fatalf("%v\n", err)
  181. }
  182. tester.initStacks = append(tester.initStacks, newStack)
  183. }
  184. func createNewStackRevision(tester *tester, t *testing.T, stackName string) {
  185. t.Helper()
  186. if len(tester.initProjects) == 0 {
  187. initProject(tester, t)
  188. }
  189. if len(tester.initUsers) == 0 {
  190. initUser(tester, t)
  191. }
  192. if len(tester.initClusters) == 0 {
  193. initCluster(tester, t)
  194. }
  195. if len(tester.initStacks) == 0 {
  196. initStack(tester, t, stackName)
  197. }
  198. stack := tester.initStacks[0]
  199. for _, s := range tester.initStacks {
  200. if s.Name == stackName {
  201. stack = s
  202. break
  203. }
  204. }
  205. prevRevision := findLatestRevisionByRevisionNumber(t, stack.Revisions)
  206. oldSourceConfig := prevRevision.SourceConfigs[0]
  207. newUid, _ := encryption.GenerateRandomBytes(16)
  208. sourceConfigs := []models.StackSourceConfig{
  209. {
  210. Name: oldSourceConfig.Name,
  211. ImageRepoURI: "some-repo-" + fmt.Sprint(prevRevision.RevisionNumber+1),
  212. ImageTag: "some-tag-" + fmt.Sprint(prevRevision.RevisionNumber+1),
  213. UID: newUid,
  214. },
  215. }
  216. newRevision := models.StackRevision{
  217. RevisionNumber: prevRevision.RevisionNumber + 1,
  218. Status: string(types.StackRevisionStatusDeploying),
  219. SourceConfigs: sourceConfigs,
  220. StackID: stack.ID,
  221. }
  222. tester.repo.Stack().AppendNewRevision(&newRevision)
  223. }
  224. func findLatestRevisionByRevisionNumber(t *testing.T, revisions []models.StackRevision) *models.StackRevision {
  225. t.Helper()
  226. latestRevision := revisions[0]
  227. for _, revision := range revisions {
  228. if revision.RevisionNumber > latestRevision.RevisionNumber {
  229. latestRevision = revision
  230. }
  231. }
  232. return &latestRevision
  233. }
  234. func appendNewSourceConfig(t *testing.T, tester *tester, stack *models.Stack, sourceConfig models.StackSourceConfig) {
  235. t.Helper()
  236. prevRevision := findLatestRevisionByRevisionNumber(t, stack.Revisions)
  237. previousSourceConfigs := []models.StackSourceConfig{}
  238. for _, sourceConfig := range prevRevision.SourceConfigs {
  239. newUid, _ := encryption.GenerateRandomBytes(16)
  240. sc := models.StackSourceConfig{
  241. Name: sourceConfig.Name,
  242. ImageRepoURI: sourceConfig.ImageRepoURI,
  243. ImageTag: sourceConfig.ImageTag,
  244. UID: newUid,
  245. }
  246. previousSourceConfigs = append(previousSourceConfigs, sc)
  247. }
  248. newRevision := models.StackRevision{
  249. RevisionNumber: prevRevision.RevisionNumber + 1,
  250. Status: string(types.StackRevisionStatusDeploying),
  251. SourceConfigs: append(prevRevision.SourceConfigs, sourceConfig),
  252. StackID: stack.ID,
  253. }
  254. tester.repo.Stack().AppendNewRevision(&newRevision)
  255. }