up.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package ecs
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. "github.com/compose-spec/compose-go/cli"
  9. "github.com/compose-spec/compose-go/types"
  10. )
  11. func (b *ecsAPIService) Up(ctx context.Context, options *cli.ProjectOptions) error {
  12. project, err := cli.ProjectFromOptions(options)
  13. if err != nil {
  14. return err
  15. }
  16. err = b.SDK.CheckRequirements(ctx, b.Region)
  17. if err != nil {
  18. return err
  19. }
  20. cluster, err := b.GetCluster(ctx, project)
  21. if err != nil {
  22. return err
  23. }
  24. template, err := b.convert(project)
  25. if err != nil {
  26. return err
  27. }
  28. vpc, err := b.GetVPC(ctx, project)
  29. if err != nil {
  30. return err
  31. }
  32. subNets, err := b.SDK.GetSubNets(ctx, vpc)
  33. if err != nil {
  34. return err
  35. }
  36. if len(subNets) < 2 {
  37. return fmt.Errorf("VPC %s should have at least 2 associated subnets in different availability zones", vpc)
  38. }
  39. lb, err := b.GetLoadBalancer(ctx, project)
  40. if err != nil {
  41. return err
  42. }
  43. parameters := map[string]string{
  44. ParameterClusterName: cluster,
  45. ParameterVPCId: vpc,
  46. ParameterSubnet1Id: subNets[0],
  47. ParameterSubnet2Id: subNets[1],
  48. ParameterLoadBalancerARN: lb,
  49. }
  50. update, err := b.SDK.StackExists(ctx, project.Name)
  51. if err != nil {
  52. return err
  53. }
  54. operation := StackCreate
  55. if update {
  56. operation = StackUpdate
  57. changeset, err := b.SDK.CreateChangeSet(ctx, project.Name, template, parameters)
  58. if err != nil {
  59. return err
  60. }
  61. err = b.SDK.UpdateStack(ctx, changeset)
  62. if err != nil {
  63. return err
  64. }
  65. } else {
  66. err = b.SDK.CreateStack(ctx, project.Name, template, parameters)
  67. if err != nil {
  68. return err
  69. }
  70. }
  71. signalChan := make(chan os.Signal, 1)
  72. signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
  73. go func() {
  74. <-signalChan
  75. fmt.Println("user interrupted deployment. Deleting stack...")
  76. b.Down(ctx, options)
  77. }()
  78. err = b.WaitStackCompletion(ctx, project.Name, operation)
  79. return err
  80. }
  81. func (b ecsAPIService) GetVPC(ctx context.Context, project *types.Project) (string, error) {
  82. //check compose file for custom VPC selected
  83. if vpc, ok := project.Extensions[ExtensionVPC]; ok {
  84. vpcID := vpc.(string)
  85. ok, err := b.SDK.VpcExists(ctx, vpcID)
  86. if err != nil {
  87. return "", err
  88. }
  89. if !ok {
  90. return "", fmt.Errorf("VPC does not exist: %s", vpc)
  91. }
  92. return vpcID, nil
  93. }
  94. defaultVPC, err := b.SDK.GetDefaultVPC(ctx)
  95. if err != nil {
  96. return "", err
  97. }
  98. return defaultVPC, nil
  99. }
  100. func (b ecsAPIService) GetLoadBalancer(ctx context.Context, project *types.Project) (string, error) {
  101. //check compose file for custom VPC selected
  102. if ext, ok := project.Extensions[ExtensionLB]; ok {
  103. lb := ext.(string)
  104. ok, err := b.SDK.LoadBalancerExists(ctx, lb)
  105. if err != nil {
  106. return "", err
  107. }
  108. if !ok {
  109. return "", fmt.Errorf("load balancer does not exist: %s", lb)
  110. }
  111. return lb, nil
  112. }
  113. return "", nil
  114. }
  115. func (b ecsAPIService) GetCluster(ctx context.Context, project *types.Project) (string, error) {
  116. //check compose file for custom VPC selected
  117. if ext, ok := project.Extensions[ExtensionCluster]; ok {
  118. cluster := ext.(string)
  119. ok, err := b.SDK.ClusterExists(ctx, cluster)
  120. if err != nil {
  121. return "", err
  122. }
  123. if !ok {
  124. return "", fmt.Errorf("cluster does not exist: %s", cluster)
  125. }
  126. return cluster, nil
  127. }
  128. return "", nil
  129. }