2
0

env_group_driver.go 2.8 KB

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