helpers_test.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. package populate_source_config_display_name_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 initEmptyStack(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. // write stack to the database with creating status
  156. stack := &models.Stack{
  157. ProjectID: tester.initProjects[0].ID,
  158. ClusterID: tester.initClusters[0].ID,
  159. Namespace: "test-namespace",
  160. Name: stackName,
  161. UID: uid,
  162. Revisions: []models.StackRevision{
  163. {
  164. RevisionNumber: 1,
  165. Status: string(types.StackRevisionStatusDeploying),
  166. SourceConfigs: []models.StackSourceConfig{},
  167. },
  168. },
  169. }
  170. newStack, err := tester.repo.Stack().CreateStack(stack)
  171. if err != nil {
  172. t.Fatalf("%v\n", err)
  173. }
  174. tester.initStacks = append(tester.initStacks, newStack)
  175. }
  176. func initStack(tester *tester, t *testing.T, stackName string) {
  177. t.Helper()
  178. if len(tester.initProjects) == 0 {
  179. initProject(tester, t)
  180. }
  181. if len(tester.initUsers) == 0 {
  182. initUser(tester, t)
  183. }
  184. if len(tester.initClusters) == 0 {
  185. initCluster(tester, t)
  186. }
  187. uid, _ := encryption.GenerateRandomBytes(16)
  188. sourceConfigs := []models.StackSourceConfig{
  189. {
  190. Name: "source-config-1",
  191. ImageRepoURI: "some-repo",
  192. ImageTag: "some-tag",
  193. UID: uid,
  194. },
  195. }
  196. // write stack to the database with creating status
  197. stack := &models.Stack{
  198. ProjectID: tester.initProjects[0].ID,
  199. ClusterID: tester.initClusters[0].ID,
  200. Namespace: "test-namespace",
  201. Name: stackName,
  202. UID: uid,
  203. Revisions: []models.StackRevision{
  204. {
  205. RevisionNumber: 1,
  206. Status: string(types.StackRevisionStatusDeploying),
  207. SourceConfigs: sourceConfigs,
  208. },
  209. },
  210. }
  211. newStack, err := tester.repo.Stack().CreateStack(stack)
  212. if err != nil {
  213. t.Fatalf("%v\n", err)
  214. }
  215. tester.initStacks = append(tester.initStacks, newStack)
  216. }
  217. func createNewStackRevision(tester *tester, t *testing.T, stackName string) {
  218. t.Helper()
  219. if len(tester.initProjects) == 0 {
  220. initProject(tester, t)
  221. }
  222. if len(tester.initUsers) == 0 {
  223. initUser(tester, t)
  224. }
  225. if len(tester.initClusters) == 0 {
  226. initCluster(tester, t)
  227. }
  228. if len(tester.initStacks) == 0 {
  229. initStack(tester, t, stackName)
  230. }
  231. stack := tester.initStacks[0]
  232. for _, s := range tester.initStacks {
  233. if s.Name == stackName {
  234. stack = s
  235. break
  236. }
  237. }
  238. prevRevision := findLatestRevisionByRevisionNumber(t, stack.Revisions)
  239. oldSourceConfig := prevRevision.SourceConfigs[0]
  240. newUid, _ := encryption.GenerateRandomBytes(16)
  241. sourceConfigs := []models.StackSourceConfig{
  242. {
  243. Name: oldSourceConfig.Name,
  244. ImageRepoURI: "some-repo-" + fmt.Sprint(prevRevision.RevisionNumber+1),
  245. ImageTag: "some-tag-" + fmt.Sprint(prevRevision.RevisionNumber+1),
  246. UID: newUid,
  247. },
  248. }
  249. newRevision := models.StackRevision{
  250. RevisionNumber: prevRevision.RevisionNumber + 1,
  251. Status: string(types.StackRevisionStatusDeploying),
  252. SourceConfigs: sourceConfigs,
  253. StackID: stack.ID,
  254. }
  255. tester.repo.Stack().AppendNewRevision(&newRevision)
  256. }
  257. func findLatestRevisionByRevisionNumber(t *testing.T, revisions []models.StackRevision) *models.StackRevision {
  258. t.Helper()
  259. latestRevision := revisions[0]
  260. for _, revision := range revisions {
  261. if revision.RevisionNumber > latestRevision.RevisionNumber {
  262. latestRevision = revision
  263. }
  264. }
  265. return &latestRevision
  266. }
  267. func appendNewSourceConfig(t *testing.T, tester *tester, stack *models.Stack, sourceConfig models.StackSourceConfig) {
  268. t.Helper()
  269. prevRevision := findLatestRevisionByRevisionNumber(t, stack.Revisions)
  270. previousSourceConfigs := []models.StackSourceConfig{}
  271. for _, sourceConfig := range prevRevision.SourceConfigs {
  272. newUid, _ := encryption.GenerateRandomBytes(16)
  273. sc := models.StackSourceConfig{
  274. Name: sourceConfig.Name,
  275. ImageRepoURI: sourceConfig.ImageRepoURI,
  276. ImageTag: sourceConfig.ImageTag,
  277. UID: newUid,
  278. }
  279. previousSourceConfigs = append(previousSourceConfigs, sc)
  280. }
  281. newRevision := models.StackRevision{
  282. RevisionNumber: prevRevision.RevisionNumber + 1,
  283. Status: string(types.StackRevisionStatusDeploying),
  284. SourceConfigs: append(prevRevision.SourceConfigs, sourceConfig),
  285. StackID: stack.ID,
  286. }
  287. tester.repo.Stack().AppendNewRevision(&newRevision)
  288. }