helpers.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package stack
  2. import (
  3. "fmt"
  4. "github.com/porter-dev/porter/api/server/shared/config"
  5. "github.com/porter-dev/porter/api/types"
  6. "github.com/porter-dev/porter/internal/encryption"
  7. "github.com/porter-dev/porter/internal/helm"
  8. "github.com/porter-dev/porter/internal/helm/loader"
  9. "github.com/porter-dev/porter/internal/models"
  10. )
  11. type applyAppResourceOpts struct {
  12. config *config.Config
  13. projectID uint
  14. namespace string
  15. cluster *models.Cluster
  16. helmAgent *helm.Agent
  17. request *types.CreateStackAppResourceRequest
  18. registries []*models.Registry
  19. }
  20. func applyAppResource(opts *applyAppResourceOpts) error {
  21. if opts.request.TemplateVersion == "latest" {
  22. opts.request.TemplateVersion = ""
  23. }
  24. chart, err := loader.LoadChartPublic(opts.request.TemplateRepoURL, opts.request.TemplateName, opts.request.TemplateVersion)
  25. if err != nil {
  26. return err
  27. }
  28. conf := &helm.InstallChartConfig{
  29. Chart: chart,
  30. Name: opts.request.Name,
  31. Namespace: opts.namespace,
  32. Values: opts.request.Values,
  33. Cluster: opts.cluster,
  34. Repo: opts.config.Repo,
  35. Registries: opts.registries,
  36. }
  37. _, err = opts.helmAgent.InstallChart(conf, opts.config.DOConf)
  38. if err != nil {
  39. return err
  40. }
  41. return nil
  42. }
  43. type rollbackAppResourceOpts struct {
  44. helmAgent *helm.Agent
  45. helmRevisionID uint
  46. name string
  47. }
  48. func rollbackAppResource(opts *rollbackAppResourceOpts) error {
  49. return opts.helmAgent.RollbackRelease(opts.name, int(opts.helmRevisionID))
  50. }
  51. type updateAppResourceTagOpts struct {
  52. helmAgent *helm.Agent
  53. name, tag string
  54. config *config.Config
  55. projectID uint
  56. namespace string
  57. cluster *models.Cluster
  58. registries []*models.Registry
  59. }
  60. func updateAppResourceTag(opts *updateAppResourceTagOpts) error {
  61. // read the current release to get the current values
  62. rel, err := opts.helmAgent.GetRelease(opts.name, 0, true)
  63. if err != nil {
  64. return err
  65. }
  66. imagePre := rel.Config["image"]
  67. image := imagePre.(map[string]interface{})
  68. image["tag"] = opts.tag
  69. rel.Config["image"] = image
  70. conf := &helm.UpgradeReleaseConfig{
  71. Name: opts.name,
  72. Cluster: opts.cluster,
  73. Repo: opts.config.Repo,
  74. Registries: opts.registries,
  75. Values: rel.Config,
  76. }
  77. _, err = opts.helmAgent.UpgradeReleaseByValues(conf, opts.config.DOConf)
  78. return err
  79. }
  80. type deleteAppResourceOpts struct {
  81. helmAgent *helm.Agent
  82. name string
  83. }
  84. func deleteAppResource(opts *deleteAppResourceOpts) error {
  85. _, err := opts.helmAgent.UninstallChart(opts.name)
  86. return err
  87. }
  88. func cloneSourceConfigs(sourceConfigs []models.StackSourceConfig) ([]models.StackSourceConfig, error) {
  89. res := make([]models.StackSourceConfig, 0)
  90. // for now, only write source configs which are deployed as a docker image
  91. // TODO: add parsing/writes for git-based sources
  92. for _, sourceConfig := range sourceConfigs {
  93. uid, err := encryption.GenerateRandomBytes(16)
  94. if err != nil {
  95. return nil, err
  96. }
  97. res = append(res, models.StackSourceConfig{
  98. UID: uid,
  99. Name: sourceConfig.Name,
  100. ImageRepoURI: sourceConfig.ImageRepoURI,
  101. ImageTag: sourceConfig.ImageTag,
  102. })
  103. }
  104. return res, nil
  105. }
  106. func cloneAppResources(
  107. appResources []models.StackResource,
  108. prevSourceConfigs []models.StackSourceConfig,
  109. newSourceConfigs []models.StackSourceConfig,
  110. ) ([]models.StackResource, error) {
  111. res := make([]models.StackResource, 0)
  112. // for now, only write source configs which are deployed as a docker image
  113. // TODO: add parsing/writes for git-based sources
  114. for _, appResource := range appResources {
  115. uid, err := encryption.GenerateRandomBytes(16)
  116. if err != nil {
  117. return nil, err
  118. }
  119. var linkedSourceConfigUID string
  120. for _, prevSourceConfig := range prevSourceConfigs {
  121. if prevSourceConfig.UID == appResource.StackSourceConfigUID {
  122. // find the corresponding new source config
  123. for _, newSourceConfig := range newSourceConfigs {
  124. if newSourceConfig.Name == prevSourceConfig.Name {
  125. linkedSourceConfigUID = newSourceConfig.UID
  126. }
  127. }
  128. }
  129. }
  130. if linkedSourceConfigUID == "" {
  131. return nil, fmt.Errorf("source config does not exist in source config list")
  132. }
  133. res = append(res, models.StackResource{
  134. Name: appResource.Name,
  135. UID: uid,
  136. StackSourceConfigUID: linkedSourceConfigUID,
  137. TemplateRepoURL: appResource.TemplateRepoURL,
  138. TemplateName: appResource.TemplateName,
  139. TemplateVersion: appResource.TemplateVersion,
  140. HelmRevisionID: appResource.HelmRevisionID,
  141. })
  142. }
  143. return res, nil
  144. }
  145. // func setValuesWithSourceConfig(values map[string]interface{}, sourceConfig )