up.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/compose-spec/compose-go/cli"
  6. "github.com/compose-spec/compose-go/types"
  7. "github.com/docker/ecs-plugin/pkg/compose"
  8. "github.com/docker/ecs-plugin/pkg/console"
  9. )
  10. func (b *Backend) Up(ctx context.Context, options cli.ProjectOptions) error {
  11. project, err := cli.ProjectFromOptions(&options)
  12. if err != nil {
  13. return err
  14. }
  15. if b.Cluster != "" {
  16. ok, err := b.api.ClusterExists(ctx, b.Cluster)
  17. if err != nil {
  18. return err
  19. }
  20. if !ok {
  21. return fmt.Errorf("configured cluster %q does not exist", b.Cluster)
  22. }
  23. }
  24. update, err := b.api.StackExists(ctx, project.Name)
  25. if err != nil {
  26. return err
  27. }
  28. if update {
  29. return fmt.Errorf("we do not (yet) support updating an existing CloudFormation stack")
  30. }
  31. template, err := b.Convert(project)
  32. if err != nil {
  33. return err
  34. }
  35. vpc, err := b.GetVPC(ctx, project)
  36. if err != nil {
  37. return err
  38. }
  39. subNets, err := b.api.GetSubNets(ctx, vpc)
  40. if err != nil {
  41. return err
  42. }
  43. lb, err := b.GetLoadBalancer(ctx, project)
  44. if err != nil {
  45. return err
  46. }
  47. parameters := map[string]string{
  48. ParameterClusterName: b.Cluster,
  49. ParameterVPCId: vpc,
  50. ParameterSubnet1Id: subNets[0],
  51. ParameterSubnet2Id: subNets[1],
  52. ParameterLoadBalancerARN: lb,
  53. }
  54. err = b.api.CreateStack(ctx, project.Name, template, parameters)
  55. if err != nil {
  56. return err
  57. }
  58. fmt.Println()
  59. w := console.NewProgressWriter()
  60. for k := range template.Resources {
  61. w.ResourceEvent(k, "PENDING", "")
  62. }
  63. return b.WaitStackCompletion(ctx, project.Name, compose.StackCreate, w)
  64. }
  65. func (b Backend) GetVPC(ctx context.Context, project *types.Project) (string, error) {
  66. //check compose file for custom VPC selected
  67. if vpc, ok := project.Extensions[compose.ExtensionVPC]; ok {
  68. vpcID := vpc.(string)
  69. ok, err := b.api.VpcExists(ctx, vpcID)
  70. if err != nil {
  71. return "", err
  72. }
  73. if !ok {
  74. return "", fmt.Errorf("VPC does not exist: %s", vpc)
  75. }
  76. }
  77. defaultVPC, err := b.api.GetDefaultVPC(ctx)
  78. if err != nil {
  79. return "", err
  80. }
  81. return defaultVPC, nil
  82. }
  83. func (b Backend) GetLoadBalancer(ctx context.Context, project *types.Project) (string, error) {
  84. //check compose file for custom VPC selected
  85. if lb, ok := project.Extensions[compose.ExtensionLB]; ok {
  86. lbName := lb.(string)
  87. ok, err := b.api.LoadBalancerExists(ctx, lbName)
  88. if err != nil {
  89. return "", err
  90. }
  91. if !ok {
  92. return "", fmt.Errorf("Load Balancer does not exist: %s", lb)
  93. }
  94. return b.api.GetLoadBalancerARN(ctx, lbName)
  95. }
  96. return "", nil
  97. }