up.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. err = b.api.CheckRequirements(ctx)
  16. if err != nil {
  17. return err
  18. }
  19. cluster, err := b.GetCluster(ctx, project)
  20. if err != nil {
  21. return err
  22. }
  23. update, err := b.api.StackExists(ctx, project.Name)
  24. if err != nil {
  25. return err
  26. }
  27. if update {
  28. return fmt.Errorf("we do not (yet) support updating an existing CloudFormation stack")
  29. }
  30. template, err := b.Convert(project)
  31. if err != nil {
  32. return err
  33. }
  34. vpc, err := b.GetVPC(ctx, project)
  35. if err != nil {
  36. return err
  37. }
  38. subNets, err := b.api.GetSubNets(ctx, vpc)
  39. if err != nil {
  40. return err
  41. }
  42. lb, err := b.GetLoadBalancer(ctx, project)
  43. if err != nil {
  44. return err
  45. }
  46. parameters := map[string]string{
  47. ParameterClusterName: cluster,
  48. ParameterVPCId: vpc,
  49. ParameterSubnet1Id: subNets[0],
  50. ParameterSubnet2Id: subNets[1],
  51. ParameterLoadBalancerARN: lb,
  52. }
  53. err = b.api.CreateStack(ctx, project.Name, template, parameters)
  54. if err != nil {
  55. return err
  56. }
  57. fmt.Println()
  58. w := console.NewProgressWriter()
  59. for k := range template.Resources {
  60. w.ResourceEvent(k, "PENDING", "")
  61. }
  62. return b.WaitStackCompletion(ctx, project.Name, compose.StackCreate, w)
  63. }
  64. func (b Backend) GetVPC(ctx context.Context, project *types.Project) (string, error) {
  65. //check compose file for custom VPC selected
  66. if vpc, ok := project.Extensions[compose.ExtensionVPC]; ok {
  67. vpcID := vpc.(string)
  68. ok, err := b.api.VpcExists(ctx, vpcID)
  69. if err != nil {
  70. return "", err
  71. }
  72. if !ok {
  73. return "", fmt.Errorf("VPC does not exist: %s", vpc)
  74. }
  75. }
  76. defaultVPC, err := b.api.GetDefaultVPC(ctx)
  77. if err != nil {
  78. return "", err
  79. }
  80. return defaultVPC, nil
  81. }
  82. func (b Backend) GetLoadBalancer(ctx context.Context, project *types.Project) (string, error) {
  83. //check compose file for custom VPC selected
  84. if ext, ok := project.Extensions[compose.ExtensionLB]; ok {
  85. lb := ext.(string)
  86. ok, err := b.api.LoadBalancerExists(ctx, lb)
  87. if err != nil {
  88. return "", err
  89. }
  90. if !ok {
  91. return "", fmt.Errorf("load balancer does not exist: %s", lb)
  92. }
  93. return lb, nil
  94. }
  95. return "", nil
  96. }
  97. func (b Backend) GetCluster(ctx context.Context, project *types.Project) (string, error) {
  98. //check compose file for custom VPC selected
  99. if ext, ok := project.Extensions[compose.ExtensionCluster]; ok {
  100. cluster := ext.(string)
  101. ok, err := b.api.ClusterExists(ctx, cluster)
  102. if err != nil {
  103. return "", err
  104. }
  105. if !ok {
  106. return "", fmt.Errorf("cluster does not exist: %s", cluster)
  107. }
  108. return cluster, nil
  109. }
  110. return "", nil
  111. }