hooks.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package stacks
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/porter-dev/porter/api/server/shared/config"
  6. "github.com/porter-dev/porter/api/types"
  7. "github.com/stefanmcshane/helm/pkg/release"
  8. "gorm.io/gorm"
  9. )
  10. func UpdateHelmRevision(config *config.Config, projID, clusterID uint, rel *release.Release) error {
  11. // read release by stack ID
  12. relModel, err := config.Repo.Release().ReadRelease(clusterID, rel.Name, rel.Namespace)
  13. if err != nil {
  14. return err
  15. }
  16. if relModel.StackResourceID == 0 {
  17. return nil
  18. }
  19. stackResource, err := config.Repo.Stack().ReadStackResource(relModel.StackResourceID)
  20. if err != nil {
  21. return err
  22. }
  23. // read the revision number corresponding and create a new revision of the stack
  24. oldStackRevision, err := config.Repo.Stack().ReadStackRevision(stackResource.StackRevisionID)
  25. if err != nil {
  26. return err
  27. }
  28. // get the latest revision for that stack
  29. stack, err := config.Repo.Stack().ReadStackByID(projID, oldStackRevision.StackID)
  30. if err != nil {
  31. return err
  32. }
  33. if len(stack.Revisions) == 0 {
  34. return fmt.Errorf("length of stack revision list was 0")
  35. }
  36. currStackRevision := stack.Revisions[0]
  37. stackRevision := &currStackRevision
  38. clonedSourceConfigs, err := CloneSourceConfigs(stackRevision.SourceConfigs)
  39. if err != nil {
  40. return err
  41. }
  42. clonedAppResources, err := CloneAppResources(stackRevision.Resources, stackRevision.SourceConfigs, clonedSourceConfigs)
  43. if err != nil {
  44. return err
  45. }
  46. for i, appResource := range clonedAppResources {
  47. if appResource.Name == rel.Name {
  48. clonedAppResources[i].HelmRevisionID = uint(rel.Version)
  49. }
  50. }
  51. clonedEnvGroups, err := CloneEnvGroups(stackRevision.EnvGroups)
  52. if err != nil {
  53. return err
  54. }
  55. stackRevision.Model = gorm.Model{}
  56. stackRevision.RevisionNumber++
  57. stackRevision.Resources = clonedAppResources
  58. stackRevision.SourceConfigs = clonedSourceConfigs
  59. stackRevision.EnvGroups = clonedEnvGroups
  60. stackRevision.Status = "deployed"
  61. stackRevision.Reason = "ApplicationUpgrade"
  62. stackRevision.Message = fmt.Sprintf("The application %s was updated from version %d to %d", rel.Name, rel.Version-1, rel.Version)
  63. _, err = config.Repo.Stack().AppendNewRevision(stackRevision)
  64. return err
  65. }
  66. func UpdateEnvGroupVersion(config *config.Config, projID, clusterID uint, envGroup *types.EnvGroup) error {
  67. // read stack env group by params
  68. stackEnvGroup, err := config.Repo.Stack().ReadStackEnvGroupFirstMatch(projID, clusterID, envGroup.Namespace, envGroup.Name)
  69. if err != nil {
  70. if errors.Is(err, gorm.ErrRecordNotFound) {
  71. return nil
  72. }
  73. return err
  74. }
  75. // read the revision number corresponding and create a new revision of the stack
  76. oldStackRevision, err := config.Repo.Stack().ReadStackRevision(stackEnvGroup.StackRevisionID)
  77. if err != nil {
  78. return err
  79. }
  80. // get the latest revision for that stack
  81. stack, err := config.Repo.Stack().ReadStackByID(projID, oldStackRevision.StackID)
  82. if err != nil {
  83. return err
  84. }
  85. if len(stack.Revisions) == 0 {
  86. return fmt.Errorf("length of stack revision list was 0")
  87. }
  88. currStackRevision := stack.Revisions[0]
  89. stackRevision := &currStackRevision
  90. clonedSourceConfigs, err := CloneSourceConfigs(stackRevision.SourceConfigs)
  91. if err != nil {
  92. return err
  93. }
  94. clonedAppResources, err := CloneAppResources(stackRevision.Resources, stackRevision.SourceConfigs, clonedSourceConfigs)
  95. if err != nil {
  96. return err
  97. }
  98. clonedEnvGroups, err := CloneEnvGroups(stackRevision.EnvGroups)
  99. if err != nil {
  100. return err
  101. }
  102. for i, clonedEnvGroup := range clonedEnvGroups {
  103. if clonedEnvGroup.Name == envGroup.Name {
  104. clonedEnvGroups[i].EnvGroupVersion = envGroup.Version
  105. }
  106. }
  107. // find all synced apps which should have an updated revision number
  108. for i, clonedAppResource := range clonedAppResources {
  109. for _, appName := range envGroup.Applications {
  110. if clonedAppResource.Name == appName {
  111. clonedAppResources[i].HelmRevisionID = clonedAppResource.HelmRevisionID + 1
  112. }
  113. }
  114. }
  115. stackRevision.Model = gorm.Model{}
  116. stackRevision.RevisionNumber++
  117. stackRevision.Resources = clonedAppResources
  118. stackRevision.SourceConfigs = clonedSourceConfigs
  119. stackRevision.EnvGroups = clonedEnvGroups
  120. stackRevision.Reason = "EnvGroupUpgrade"
  121. stackRevision.Message = fmt.Sprintf("The environment group %s was updated from version %d to %d", envGroup.Name, envGroup.Version-1, envGroup.Version)
  122. stackRevision.Status = "deployed"
  123. _, err = config.Repo.Stack().AppendNewRevision(stackRevision)
  124. return err
  125. }
  126. func GetStackForEnvGroup(config *config.Config, projID, clusterID uint, envGroup *types.EnvGroup) (string, error) {
  127. // read stack env group by params
  128. stackEnvGroup, err := config.Repo.Stack().ReadStackEnvGroupFirstMatch(projID, clusterID, envGroup.Namespace, envGroup.Name)
  129. if err != nil {
  130. if errors.Is(err, gorm.ErrRecordNotFound) {
  131. return "", nil
  132. }
  133. return "", err
  134. }
  135. // read the revision number corresponding and create a new revision of the stack
  136. oldStackRevision, err := config.Repo.Stack().ReadStackRevision(stackEnvGroup.StackRevisionID)
  137. if err != nil {
  138. return "", err
  139. }
  140. // get the latest revision for that stack
  141. stack, err := config.Repo.Stack().ReadStackByID(projID, oldStackRevision.StackID)
  142. if err != nil {
  143. return "", err
  144. }
  145. return stack.UID, nil
  146. }