env_group_driver.go 3.0 KB

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