compose.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package commands
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/docker/cli/cli/command"
  6. "github.com/docker/ecs-plugin/pkg/amazon"
  7. "github.com/docker/ecs-plugin/pkg/compose"
  8. "github.com/docker/ecs-plugin/pkg/docker"
  9. "github.com/spf13/cobra"
  10. )
  11. func ComposeCommand(dockerCli command.Cli) *cobra.Command {
  12. cmd := &cobra.Command{
  13. Use: "compose",
  14. }
  15. opts := &compose.ProjectOptions{}
  16. opts.AddFlags(cmd.Flags())
  17. cmd.AddCommand(
  18. ConvertCommand(dockerCli, opts),
  19. UpCommand(dockerCli, opts),
  20. DownCommand(dockerCli, opts),
  21. LogsCommand(dockerCli, opts),
  22. )
  23. return cmd
  24. }
  25. type upOptions struct {
  26. loadBalancerArn string
  27. }
  28. func (o upOptions) LoadBalancerArn() *string {
  29. if o.loadBalancerArn == "" {
  30. return nil
  31. }
  32. return &o.loadBalancerArn
  33. }
  34. func ConvertCommand(dockerCli command.Cli, projectOpts *compose.ProjectOptions) *cobra.Command {
  35. cmd := &cobra.Command{
  36. Use: "convert",
  37. RunE: compose.WithProject(projectOpts, func(project *compose.Project, args []string) error {
  38. clusteropts, err := docker.GetAwsContext(dockerCli)
  39. if err != nil {
  40. return err
  41. }
  42. client, err := amazon.NewClient(clusteropts.Profile, clusteropts.Cluster, clusteropts.Region)
  43. if err != nil {
  44. return err
  45. }
  46. template, err := client.Convert(project)
  47. if err != nil {
  48. return err
  49. }
  50. j, err := template.JSON()
  51. if err != nil {
  52. fmt.Printf("Failed to generate JSON: %s\n", err)
  53. } else {
  54. fmt.Printf("%s\n", string(j))
  55. }
  56. return nil
  57. }),
  58. }
  59. return cmd
  60. }
  61. func UpCommand(dockerCli command.Cli, projectOpts *compose.ProjectOptions) *cobra.Command {
  62. opts := upOptions{}
  63. cmd := &cobra.Command{
  64. Use: "up",
  65. RunE: compose.WithProject(projectOpts, func(project *compose.Project, args []string) error {
  66. clusteropts, err := docker.GetAwsContext(dockerCli)
  67. if err != nil {
  68. return err
  69. }
  70. client, err := amazon.NewClient(clusteropts.Profile, clusteropts.Cluster, clusteropts.Region)
  71. if err != nil {
  72. return err
  73. }
  74. return client.ComposeUp(context.Background(), project)
  75. }),
  76. }
  77. cmd.Flags().StringVar(&opts.loadBalancerArn, "load-balancer", "", "")
  78. return cmd
  79. }
  80. type downOptions struct {
  81. DeleteCluster bool
  82. }
  83. func DownCommand(dockerCli command.Cli, projectOpts *compose.ProjectOptions) *cobra.Command {
  84. opts := downOptions{}
  85. cmd := &cobra.Command{
  86. Use: "down",
  87. RunE: docker.WithAwsContext(dockerCli, func(clusteropts docker.AwsContext, args []string) error {
  88. client, err := amazon.NewClient(clusteropts.Profile, clusteropts.Cluster, clusteropts.Region)
  89. if err != nil {
  90. return err
  91. }
  92. if len(args) == 0 {
  93. project, err := compose.ProjectFromOptions(projectOpts)
  94. if err != nil {
  95. return err
  96. }
  97. return client.ComposeDown(context.Background(), project.Name, opts.DeleteCluster)
  98. }
  99. // project names passed as parameters
  100. for _, name := range args {
  101. err := client.ComposeDown(context.Background(), name, opts.DeleteCluster)
  102. if err != nil {
  103. return err
  104. }
  105. }
  106. return nil
  107. }),
  108. }
  109. cmd.Flags().BoolVar(&opts.DeleteCluster, "delete-cluster", false, "Delete cluster")
  110. return cmd
  111. }
  112. func LogsCommand(dockerCli command.Cli, projectOpts *compose.ProjectOptions) *cobra.Command {
  113. cmd := &cobra.Command{
  114. Use: "logs [PROJECT NAME]",
  115. RunE: docker.WithAwsContext(dockerCli, func(clusteropts docker.AwsContext, args []string) error {
  116. client, err := amazon.NewClient(clusteropts.Profile, clusteropts.Cluster, clusteropts.Region)
  117. if err != nil {
  118. return err
  119. }
  120. var name string
  121. if len(args) == 0 {
  122. project, err := compose.ProjectFromOptions(projectOpts)
  123. if err != nil {
  124. return err
  125. }
  126. name = project.Name
  127. } else {
  128. name = args[0]
  129. }
  130. return client.ComposeLogs(context.Background(), name)
  131. }),
  132. }
  133. return cmd
  134. }