up.go 2.3 KB

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