up.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package amazon
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/awslabs/goformation/v4/cloudformation"
  6. "github.com/docker/ecs-plugin/pkg/compose"
  7. )
  8. func (c *client) ComposeUp(ctx context.Context, project *compose.Project) error {
  9. if c.Cluster != "" {
  10. ok, err := c.api.ClusterExists(ctx, c.Cluster)
  11. if err != nil {
  12. return err
  13. }
  14. if !ok {
  15. return fmt.Errorf("configured cluster %q does not exist", c.Cluster)
  16. }
  17. }
  18. update, err := c.api.StackExists(ctx, project.Name)
  19. if err != nil {
  20. return err
  21. }
  22. if update {
  23. return fmt.Errorf("we do not (yet) support updating an existing CloudFormation stack")
  24. }
  25. err = c.Validate(project)
  26. if err != nil {
  27. return err
  28. }
  29. template, err := c.Convert(project)
  30. if err != nil {
  31. return err
  32. }
  33. vpc, err := c.GetVPC(ctx, project)
  34. if err != nil {
  35. return err
  36. }
  37. subNets, err := c.api.GetSubNets(ctx, vpc)
  38. if err != nil {
  39. return err
  40. }
  41. parameters := map[string]string{
  42. ParameterClusterName: c.Cluster,
  43. ParameterVPCId: vpc,
  44. ParameterSubnet1Id: subNets[0],
  45. ParameterSubnet2Id: subNets[1],
  46. }
  47. err = c.api.CreateStack(ctx, project.Name, template, parameters)
  48. if err != nil {
  49. return err
  50. }
  51. return c.WaitStackCompletion(ctx, project.Name, StackCreate)
  52. }
  53. func (c client) GetVPC(ctx context.Context, project *compose.Project) (string, error) {
  54. //check compose file for the default external network
  55. if net, ok := project.Networks["default"]; ok {
  56. if net.External.External {
  57. vpc := net.Name
  58. ok, err := c.api.VpcExists(ctx, vpc)
  59. if err != nil {
  60. return "", err
  61. }
  62. if !ok {
  63. return "", fmt.Errorf("VPC does not exist: %s", vpc)
  64. }
  65. return vpc, nil
  66. }
  67. }
  68. defaultVPC, err := c.api.GetDefaultVPC(ctx)
  69. if err != nil {
  70. return "", err
  71. }
  72. return defaultVPC, nil
  73. }
  74. type upAPI interface {
  75. waitAPI
  76. GetDefaultVPC(ctx context.Context) (string, error)
  77. VpcExists(ctx context.Context, vpcID string) (bool, error)
  78. GetSubNets(ctx context.Context, vpcID string) ([]string, error)
  79. ClusterExists(ctx context.Context, name string) (bool, error)
  80. StackExists(ctx context.Context, name string) (bool, error)
  81. CreateStack(ctx context.Context, name string, template *cloudformation.Template, parameters map[string]string) error
  82. }