2
0

stack.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package models
  2. import (
  3. "github.com/porter-dev/porter/api/types"
  4. "gorm.io/gorm"
  5. )
  6. // Stack represents the metadata for a stack on Porter
  7. type Stack struct {
  8. gorm.Model
  9. ProjectID uint
  10. ClusterID uint
  11. Namespace string
  12. Name string
  13. UID string `gorm:"unique"`
  14. Revisions []StackRevision
  15. }
  16. func (s *Stack) ToStackType() *types.Stack {
  17. revisions := []types.StackRevisionMeta{}
  18. for _, rev := range s.Revisions {
  19. revisions = append(revisions, rev.ToStackRevisionMetaType(s.UID))
  20. }
  21. var latestRevision *types.StackRevision
  22. if len(s.Revisions) > 0 {
  23. latestRevision = s.Revisions[0].ToStackRevisionType(s.UID)
  24. }
  25. return &types.Stack{
  26. CreatedAt: s.CreatedAt,
  27. UpdatedAt: s.UpdatedAt,
  28. Name: s.Name,
  29. Namespace: s.Namespace,
  30. ID: s.UID,
  31. LatestRevision: latestRevision,
  32. Revisions: revisions,
  33. }
  34. }
  35. // StackRevision represents the revision information for the stack
  36. type StackRevision struct {
  37. gorm.Model
  38. RevisionNumber uint
  39. StackID uint
  40. Status string
  41. Reason string
  42. Message string
  43. Resources []StackResource
  44. SourceConfigs []StackSourceConfig
  45. EnvGroups []StackEnvGroup
  46. }
  47. func (s StackRevision) ToStackRevisionMetaType(stackID string) types.StackRevisionMeta {
  48. return types.StackRevisionMeta{
  49. CreatedAt: s.CreatedAt,
  50. ID: s.RevisionNumber,
  51. Status: types.StackRevisionStatus(s.Status),
  52. StackID: stackID,
  53. }
  54. }
  55. func (s StackRevision) ToStackRevisionType(stackID string) *types.StackRevision {
  56. metaType := s.ToStackRevisionMetaType(stackID)
  57. sourceConfigs := make([]types.StackSourceConfig, 0)
  58. for _, sourceConfig := range s.SourceConfigs {
  59. sourceConfigs = append(sourceConfigs, *sourceConfig.ToStackSourceConfigType(stackID, s.RevisionNumber))
  60. }
  61. resources := make([]types.StackResource, 0)
  62. for _, stackResource := range s.Resources {
  63. resources = append(resources, *stackResource.ToStackResource(stackID, s.RevisionNumber, s.SourceConfigs))
  64. }
  65. envGroups := make([]types.StackEnvGroup, 0)
  66. for _, stackEnvGroup := range s.EnvGroups {
  67. envGroups = append(envGroups, *stackEnvGroup.ToStackEnvGroupType(stackID, s.RevisionNumber))
  68. }
  69. return &types.StackRevision{
  70. StackRevisionMeta: &metaType,
  71. SourceConfigs: sourceConfigs,
  72. Resources: resources,
  73. EnvGroups: envGroups,
  74. Reason: s.Reason,
  75. Message: s.Message,
  76. }
  77. }
  78. type StackResource struct {
  79. gorm.Model
  80. Name string
  81. UID string
  82. StackRevisionID uint
  83. StackSourceConfigUID string
  84. HelmRevisionID uint
  85. Values []byte
  86. TemplateRepoURL string
  87. TemplateName string
  88. TemplateVersion string
  89. }
  90. func (s StackResource) ToStackResource(stackID string, stackRevisionID uint, sourceConfigs []StackSourceConfig) *types.StackResource {
  91. // find the relevant source config
  92. var linkedSourceConfig StackSourceConfig
  93. for _, sourceConfig := range sourceConfigs {
  94. if sourceConfig.UID == s.StackSourceConfigUID {
  95. linkedSourceConfig = sourceConfig
  96. break
  97. }
  98. }
  99. return &types.StackResource{
  100. CreatedAt: s.CreatedAt,
  101. UpdatedAt: s.UpdatedAt,
  102. Name: s.Name,
  103. ID: s.UID,
  104. StackSourceConfig: linkedSourceConfig.ToStackSourceConfigType(stackID, stackRevisionID),
  105. StackID: stackID,
  106. // Note that `StackRevisionID` on the API refers to the numerical auto-incremented revision ID, not
  107. // the stack_revision_id in the database.
  108. StackRevisionID: stackRevisionID,
  109. StackAppData: &types.StackResourceAppData{
  110. TemplateRepoURL: s.TemplateRepoURL,
  111. TemplateName: s.TemplateName,
  112. TemplateVersion: s.TemplateVersion,
  113. },
  114. }
  115. }
  116. type StackSourceConfig struct {
  117. gorm.Model
  118. // A unique identifier for this source config, this will allow us identify a same source config
  119. // across multiple revisions and updates. This is not the same as the UID or ID which are updated over revisions.
  120. StableSourceConfigID string
  121. StackRevisionID uint
  122. Name string
  123. UID string
  124. ImageRepoURI string
  125. ImageTag string
  126. // TODO: add git-specific information
  127. }
  128. func (s StackSourceConfig) ToStackSourceConfigType(stackID string, stackRevisionID uint) *types.StackSourceConfig {
  129. return &types.StackSourceConfig{
  130. CreatedAt: s.CreatedAt,
  131. UpdatedAt: s.UpdatedAt,
  132. StackID: stackID,
  133. StackRevisionID: stackRevisionID,
  134. Name: s.Name,
  135. ID: s.UID,
  136. ImageRepoURI: s.ImageRepoURI,
  137. ImageTag: s.ImageTag,
  138. StableSourceConfigID: s.StableSourceConfigID,
  139. }
  140. }
  141. type StackEnvGroup struct {
  142. gorm.Model
  143. StackRevisionID uint
  144. Name string
  145. Namespace string
  146. ProjectID uint
  147. ClusterID uint
  148. UID string
  149. EnvGroupVersion uint
  150. }
  151. func (s StackEnvGroup) ToStackEnvGroupType(stackID string, stackRevisionID uint) *types.StackEnvGroup {
  152. return &types.StackEnvGroup{
  153. CreatedAt: s.CreatedAt,
  154. UpdatedAt: s.UpdatedAt,
  155. StackID: stackID,
  156. StackRevisionID: stackRevisionID,
  157. Name: s.Name,
  158. ID: s.UID,
  159. EnvGroupVersion: s.EnvGroupVersion,
  160. }
  161. }