up.go 3.0 KB

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