utils.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package preview
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. "github.com/porter-dev/porter/api/types"
  8. "github.com/porter-dev/porter/cli/cmd/config"
  9. "github.com/porter-dev/porter/internal/integrations/preview"
  10. )
  11. func GetSource(resourceName string, input map[string]interface{}) (*preview.Source, error) {
  12. output := &preview.Source{}
  13. // first read from env vars
  14. output.Name = os.Getenv("PORTER_SOURCE_NAME")
  15. output.Repo = os.Getenv("PORTER_SOURCE_REPO")
  16. output.Version = os.Getenv("PORTER_SOURCE_VERSION")
  17. // next, check for values in the YAML file
  18. if output.Name == "" {
  19. if name, ok := input["name"]; ok {
  20. nameVal, ok := name.(string)
  21. if !ok {
  22. return nil, fmt.Errorf("error parsing source for resource '%s': invalid name provided", resourceName)
  23. }
  24. output.Name = nameVal
  25. }
  26. }
  27. if output.Name == "" {
  28. return nil, fmt.Errorf("error parsing source for resource '%s': source name required", resourceName)
  29. }
  30. if output.Repo == "" {
  31. if repo, ok := input["repo"]; ok {
  32. repoVal, ok := repo.(string)
  33. if !ok {
  34. return nil, fmt.Errorf("error parsing source for resource '%s': invalid repo provided", resourceName)
  35. }
  36. output.Repo = repoVal
  37. }
  38. }
  39. if output.Version == "" {
  40. if version, ok := input["version"]; ok {
  41. versionVal, ok := version.(string)
  42. if !ok {
  43. return nil, fmt.Errorf("error parsing source for resource '%s': invalid version provided", resourceName)
  44. }
  45. output.Version = versionVal
  46. }
  47. }
  48. // lastly, just put in the defaults
  49. if output.Version == "" {
  50. output.Version = "latest"
  51. }
  52. output.IsApplication = output.Repo == "https://charts.getporter.dev"
  53. if output.Repo == "" {
  54. output.Repo = "https://charts.getporter.dev"
  55. values, err := existsInRepo(output.Name, output.Version, output.Repo)
  56. if err == nil {
  57. // found in "https://charts.getporter.dev"
  58. output.SourceValues = values
  59. output.IsApplication = true
  60. return output, nil
  61. }
  62. output.Repo = "https://chart-addons.getporter.dev"
  63. values, err = existsInRepo(output.Name, output.Version, output.Repo)
  64. if err == nil {
  65. // found in https://chart-addons.getporter.dev
  66. output.SourceValues = values
  67. return output, nil
  68. }
  69. return nil, fmt.Errorf("error parsing source for resource '%s': source does not exist in "+
  70. "'https://charts.getporter.dev' or 'https://chart-addons.getporter.dev'", resourceName)
  71. } else {
  72. // we look in the passed-in repo
  73. values, err := existsInRepo(output.Name, output.Version, output.Repo)
  74. if err == nil {
  75. output.SourceValues = values
  76. return output, nil
  77. }
  78. }
  79. return nil, fmt.Errorf("error parsing source for resource '%s': source '%s' does not exist in repo '%s'",
  80. resourceName, output.Name, output.Repo)
  81. }
  82. func GetTarget(resourceName string, input map[string]interface{}) (*preview.Target, error) {
  83. output := &preview.Target{}
  84. // first read from env vars
  85. if projectEnv := os.Getenv("PORTER_PROJECT"); projectEnv != "" {
  86. project, err := strconv.Atoi(projectEnv)
  87. if err != nil {
  88. return nil, fmt.Errorf("error parsing target for resource '%s': %w", resourceName, err)
  89. }
  90. output.Project = uint(project)
  91. }
  92. if clusterEnv := os.Getenv("PORTER_CLUSTER"); clusterEnv != "" {
  93. cluster, err := strconv.Atoi(clusterEnv)
  94. if err != nil {
  95. return nil, fmt.Errorf("error parsing target for resource '%s': %w", resourceName, err)
  96. }
  97. output.Cluster = uint(cluster)
  98. }
  99. output.Namespace = os.Getenv("PORTER_NAMESPACE")
  100. // next, check for values in the YAML file
  101. if output.Project == 0 {
  102. if project, ok := input["project"]; ok {
  103. projectVal, ok := project.(uint)
  104. if !ok {
  105. return nil, fmt.Errorf("error parsing target for resource '%s': project value must be an integer", resourceName)
  106. }
  107. output.Project = projectVal
  108. }
  109. }
  110. if output.Cluster == 0 {
  111. if cluster, ok := input["cluster"]; ok {
  112. clusterVal, ok := cluster.(uint)
  113. if !ok {
  114. return nil, fmt.Errorf("error parsing target for resource '%s': cluster value must be an integer",
  115. resourceName)
  116. }
  117. output.Cluster = clusterVal
  118. }
  119. }
  120. if output.Namespace == "" {
  121. if namespace, ok := input["namespace"]; ok {
  122. namespaceVal, ok := namespace.(string)
  123. if !ok {
  124. return nil, fmt.Errorf("error parsing target for resource '%s': invalid namespace provided", resourceName)
  125. }
  126. output.Namespace = namespaceVal
  127. }
  128. }
  129. if appName, ok := input["app_name"]; ok {
  130. appNameVal, ok := appName.(string)
  131. if !ok {
  132. return nil, fmt.Errorf("error parsing target for resource '%s': invalid app_name provided", resourceName)
  133. }
  134. output.AppName = appNameVal
  135. }
  136. // lastly, just put in the defaults
  137. if output.Project == 0 {
  138. output.Project = config.GetCLIConfig().Project
  139. }
  140. if output.Cluster == 0 {
  141. output.Cluster = config.GetCLIConfig().Cluster
  142. }
  143. if output.Namespace == "" {
  144. output.Namespace = "default"
  145. }
  146. return output, nil
  147. }
  148. func existsInRepo(name, version, url string) (map[string]interface{}, error) {
  149. chart, err := config.GetAPIClient().GetTemplate(
  150. context.Background(),
  151. name, version,
  152. &types.GetTemplateRequest{
  153. TemplateGetBaseRequest: types.TemplateGetBaseRequest{
  154. RepoURL: url,
  155. },
  156. },
  157. )
  158. if err != nil {
  159. return nil, err
  160. }
  161. return chart.Values, nil
  162. }