env_group_driver.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. envGroupResp, 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. newEnvGroup, 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. envGroupResp = &types.GetEnvGroupResponse{
  73. EnvGroup: &types.EnvGroup{
  74. Name: newEnvGroup.Name,
  75. Variables: newEnvGroup.Variables,
  76. },
  77. }
  78. } else if err != nil {
  79. return nil, err
  80. }
  81. d.output[envGroupResp.Name] = map[string]interface{}{
  82. "variables": envGroupResp.Variables,
  83. }
  84. }
  85. return resource, nil
  86. }
  87. func (d *EnvGroupDriver) Output() (map[string]interface{}, error) {
  88. return d.output, nil
  89. }
  90. func (d *EnvGroupDriver) getConfig(resource *models.Resource) (*EnvGroupDriverConfig, error) {
  91. populatedConf, err := drivers.ConstructConfig(&drivers.ConstructConfigOpts{
  92. RawConf: resource.Config,
  93. LookupTable: *d.lookupTable,
  94. Dependencies: resource.Dependencies,
  95. })
  96. if err != nil {
  97. return nil, err
  98. }
  99. config := &EnvGroupDriverConfig{}
  100. err = mapstructure.Decode(populatedConf, config)
  101. if err != nil {
  102. return nil, err
  103. }
  104. return config, nil
  105. }