2
0

env_group_driver.go 3.4 KB

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