worker.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package worker
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/porter-dev/porter/cli/cmd/switchboard/drivers"
  6. "github.com/porter-dev/porter/cli/cmd/switchboard/drivers/helm"
  7. "github.com/porter-dev/porter/cli/cmd/switchboard/drivers/kubernetes"
  8. "github.com/porter-dev/porter/cli/cmd/switchboard/drivers/terraform"
  9. "github.com/porter-dev/porter/cli/cmd/switchboard/exec"
  10. "github.com/porter-dev/porter/cli/cmd/switchboard/models"
  11. "github.com/porter-dev/porter/cli/cmd/switchboard/types"
  12. "github.com/rs/zerolog"
  13. )
  14. type ApplyOpts struct {
  15. BasePath string
  16. Logger *zerolog.Logger
  17. ResourceLogger *zerolog.Logger
  18. }
  19. // Apply creates a ResourceGroup
  20. func Apply(group *types.ResourceGroup, opts *ApplyOpts) error {
  21. // create a map of resource names to drivers
  22. driverLookupTable := make(map[string]drivers.Driver)
  23. stdOut := zerolog.New(zerolog.ConsoleWriter{Out: os.Stdout})
  24. sharedDriverOpts := &drivers.SharedDriverOpts{
  25. BaseDir: opts.BasePath,
  26. DriverLookupTable: &driverLookupTable,
  27. Logger: &stdOut,
  28. }
  29. execFunc := getExecFunc(sharedDriverOpts)
  30. resources := make([]*models.Resource, 0)
  31. for _, resource := range group.Resources {
  32. modelResource := &models.Resource{
  33. Name: resource.Name,
  34. Driver: resource.Driver,
  35. Config: resource.Config,
  36. Source: resource.Source,
  37. Target: resource.Target,
  38. Dependencies: resource.DependsOn,
  39. }
  40. resources = append(resources, modelResource)
  41. var driver drivers.Driver
  42. var err error
  43. // switch on the driver type to construct the driver
  44. switch resource.Driver {
  45. case "kubernetes":
  46. driver, err = kubernetes.NewKubernetesDriver(modelResource, sharedDriverOpts)
  47. case "helm":
  48. driver, err = helm.NewHelmDriver(modelResource, sharedDriverOpts)
  49. case "terraform":
  50. driver, err = terraform.NewTerraformDriver(modelResource, sharedDriverOpts)
  51. }
  52. // TODO: append errors, don't exit here
  53. if err != nil {
  54. stdOut.Err(err).Send()
  55. return err
  56. }
  57. driverLookupTable[resource.Name] = driver
  58. }
  59. nodes, err := exec.GetExecNodes(&models.ResourceGroup{
  60. APIVersion: group.Version,
  61. Resources: resources,
  62. })
  63. if err != nil {
  64. stdOut.Err(err).Send()
  65. return err
  66. }
  67. return exec.Execute(nodes, execFunc)
  68. }
  69. func getExecFunc(opts *drivers.SharedDriverOpts) exec.ExecFunc {
  70. return func(resource *models.Resource) error {
  71. opts.Logger.Info().Msg(
  72. fmt.Sprintf("running apply for resource %s", resource.Name),
  73. )
  74. lookupTable := *opts.DriverLookupTable
  75. _, err := lookupTable[resource.Name].Apply(resource)
  76. if err != nil {
  77. return err
  78. }
  79. opts.Logger.Info().Msg(
  80. fmt.Sprintf("successfully applied resource %s", resource.Name),
  81. )
  82. return nil
  83. }
  84. }