up.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. template, err := c.Convert(project)
  26. if err != nil {
  27. return err
  28. }
  29. vpc, err := c.GetVPC(ctx, project)
  30. if err != nil {
  31. return err
  32. }
  33. subNets, err := c.api.GetSubNets(ctx, vpc)
  34. if err != nil {
  35. return err
  36. }
  37. parameters := map[string]string{
  38. ParameterClusterName: c.Cluster,
  39. ParameterVPCId: vpc,
  40. ParameterSubnet1Id: subNets[0],
  41. ParameterSubnet2Id: subNets[1],
  42. }
  43. err = c.api.CreateStack(ctx, project.Name, template, parameters)
  44. if err != nil {
  45. return err
  46. }
  47. return c.WaitStackCompletion(ctx, project.Name, StackCreate)
  48. }
  49. func (c client) GetVPC(ctx context.Context, project *compose.Project) (string, error) {
  50. //check compose file for the default external network
  51. if net, ok := project.Networks["default"]; ok {
  52. if net.External.External {
  53. vpc := net.Name
  54. ok, err := c.api.VpcExists(ctx, vpc)
  55. if err != nil {
  56. return "", err
  57. }
  58. if !ok {
  59. return "", fmt.Errorf("VPC does not exist: %s", vpc)
  60. }
  61. return vpc, nil
  62. }
  63. }
  64. defaultVPC, err := c.api.GetDefaultVPC(ctx)
  65. if err != nil {
  66. return "", err
  67. }
  68. return defaultVPC, nil
  69. }
  70. type upAPI interface {
  71. waitAPI
  72. GetDefaultVPC(ctx context.Context) (string, error)
  73. VpcExists(ctx context.Context, vpcID string) (bool, error)
  74. GetSubNets(ctx context.Context, vpcID string) ([]string, error)
  75. ClusterExists(ctx context.Context, name string) (bool, error)
  76. StackExists(ctx context.Context, name string) (bool, error)
  77. CreateStack(ctx context.Context, name string, template *cloudformation.Template, parameters map[string]string) error
  78. }