env_group_driver.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package preview
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/fatih/color"
  6. "github.com/mitchellh/mapstructure"
  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. "github.com/porter-dev/switchboard/pkg/drivers"
  11. "github.com/porter-dev/switchboard/pkg/models"
  12. )
  13. type EnvGroupDriver struct {
  14. output map[string]interface{}
  15. lookupTable *map[string]drivers.Driver
  16. target *preview.Target
  17. config *preview.EnvGroupDriverConfig
  18. }
  19. func NewEnvGroupDriver(resource *models.Resource, opts *drivers.SharedDriverOpts) (drivers.Driver, error) {
  20. driver := &EnvGroupDriver{
  21. lookupTable: opts.DriverLookupTable,
  22. output: make(map[string]interface{}),
  23. }
  24. target, err := GetTarget(resource.Name, resource.Target)
  25. if err != nil {
  26. return nil, err
  27. }
  28. driver.target = target
  29. return driver, nil
  30. }
  31. func (d *EnvGroupDriver) ShouldApply(resource *models.Resource) bool {
  32. return true
  33. }
  34. func (d *EnvGroupDriver) Apply(resource *models.Resource) (*models.Resource, error) {
  35. driverConfig, err := d.getConfig(resource)
  36. if err != nil {
  37. return nil, err
  38. }
  39. d.config = driverConfig
  40. client := config.GetAPIClient()
  41. for _, group := range d.config.EnvGroups {
  42. if group.Name == "" {
  43. return nil, fmt.Errorf("env group name cannot be empty")
  44. }
  45. if group.Namespace == "" {
  46. color.New(color.FgYellow).Printf("env group %s has empty namespace so defaulting to target namespace %s\n",
  47. group.Name, d.target.Namespace)
  48. group.Namespace = d.target.Namespace
  49. }
  50. envGroupResp, err := client.GetEnvGroup(
  51. context.Background(),
  52. d.target.Project,
  53. d.target.Cluster,
  54. group.Namespace,
  55. &types.GetEnvGroupRequest{
  56. Name: group.Name,
  57. },
  58. )
  59. if err != nil && err.Error() == "env group not found" {
  60. newEnvGroup, err := client.CreateEnvGroup(
  61. context.Background(), d.target.Project, d.target.Cluster, group.Namespace,
  62. &types.CreateEnvGroupRequest{
  63. Name: group.Name,
  64. Variables: group.Variables,
  65. },
  66. )
  67. if err != nil {
  68. return nil, err
  69. }
  70. envGroupResp = &types.GetEnvGroupResponse{
  71. EnvGroup: &types.EnvGroup{
  72. Name: newEnvGroup.Name,
  73. Variables: newEnvGroup.Variables,
  74. },
  75. }
  76. } else if err != nil {
  77. return nil, err
  78. }
  79. d.output[envGroupResp.Name] = map[string]interface{}{
  80. "variables": envGroupResp.Variables,
  81. }
  82. }
  83. return resource, nil
  84. }
  85. func (d *EnvGroupDriver) Output() (map[string]interface{}, error) {
  86. return d.output, nil
  87. }
  88. func (d *EnvGroupDriver) getConfig(resource *models.Resource) (*preview.EnvGroupDriverConfig, error) {
  89. populatedConf, err := drivers.ConstructConfig(&drivers.ConstructConfigOpts{
  90. RawConf: resource.Config,
  91. LookupTable: *d.lookupTable,
  92. Dependencies: resource.Dependencies,
  93. })
  94. if err != nil {
  95. return nil, err
  96. }
  97. config := &preview.EnvGroupDriverConfig{}
  98. err = mapstructure.Decode(populatedConf, config)
  99. if err != nil {
  100. return nil, err
  101. }
  102. return config, nil
  103. }