env_group_driver.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package preview
  2. import (
  3. "context"
  4. "github.com/fatih/color"
  5. "github.com/mitchellh/mapstructure"
  6. "github.com/porter-dev/porter/api/types"
  7. "github.com/porter-dev/porter/cli/cmd/config"
  8. "github.com/porter-dev/switchboard/pkg/drivers"
  9. "github.com/porter-dev/switchboard/pkg/models"
  10. )
  11. type EnvGroupDriverConfig struct {
  12. EnvGroups []*types.EnvGroup `mapstructure:"env_groups"`
  13. }
  14. type EnvGroupDriver struct {
  15. output map[string]interface{}
  16. lookupTable *map[string]drivers.Driver
  17. target *Target
  18. config *EnvGroupDriverConfig
  19. }
  20. func NewEnvGroupDriver(resource *models.Resource, opts *drivers.SharedDriverOpts) (drivers.Driver, error) {
  21. driver := &EnvGroupDriver{
  22. lookupTable: opts.DriverLookupTable,
  23. output: make(map[string]interface{}),
  24. }
  25. target, err := GetTarget(resource.Target)
  26. if err != nil {
  27. return nil, err
  28. }
  29. driver.target = target
  30. return driver, nil
  31. }
  32. func (d *EnvGroupDriver) ShouldApply(resource *models.Resource) bool {
  33. return true
  34. }
  35. func (d *EnvGroupDriver) Apply(resource *models.Resource) (*models.Resource, error) {
  36. driverConfig, err := d.getConfig(resource)
  37. if err != nil {
  38. return nil, err
  39. }
  40. d.config = driverConfig
  41. client := config.GetAPIClient()
  42. for _, group := range d.config.EnvGroups {
  43. if group.Namespace == "" {
  44. color.New(color.FgYellow).Printf("env group %s has empty namespace so defaulting to target namespace %s\n",
  45. group.Name, d.target.Namespace)
  46. group.Namespace = d.target.Namespace
  47. }
  48. _, err = client.CreateEnvGroup(
  49. context.Background(), d.target.Project, d.target.Cluster, group.Namespace,
  50. &types.CreateEnvGroupRequest{
  51. Name: group.Name,
  52. Variables: group.Variables,
  53. },
  54. )
  55. if err != nil {
  56. return nil, err
  57. }
  58. }
  59. return resource, nil
  60. }
  61. func (d *EnvGroupDriver) Output() (map[string]interface{}, error) {
  62. return d.output, nil
  63. }
  64. func (d *EnvGroupDriver) getConfig(resource *models.Resource) (*EnvGroupDriverConfig, error) {
  65. populatedConf, err := drivers.ConstructConfig(&drivers.ConstructConfigOpts{
  66. RawConf: resource.Config,
  67. LookupTable: *d.lookupTable,
  68. Dependencies: resource.Dependencies,
  69. })
  70. if err != nil {
  71. return nil, err
  72. }
  73. config := &EnvGroupDriverConfig{}
  74. err = mapstructure.Decode(populatedConf, config)
  75. if err != nil {
  76. return nil, err
  77. }
  78. return config, nil
  79. }