list.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/compose-spec/compose-go/types"
  6. "github.com/docker/ecs-plugin/pkg/compose"
  7. )
  8. func (b *Backend) Ps(ctx context.Context, project *types.Project) ([]compose.ServiceStatus, error) {
  9. cluster := b.Cluster
  10. if cluster == "" {
  11. cluster = project.Name
  12. }
  13. resources, err := b.api.ListStackResources(ctx, project.Name)
  14. if err != nil {
  15. return nil, err
  16. }
  17. var loadBalancer string
  18. if lb, ok := project.Extensions[compose.ExtensionLB]; ok {
  19. loadBalancer = lb.(string)
  20. }
  21. servicesARN := []string{}
  22. for _, r := range resources {
  23. switch r.Type {
  24. case "AWS::ECS::Service":
  25. servicesARN = append(servicesARN, r.ARN)
  26. case "AWS::ElasticLoadBalancingV2::LoadBalancer":
  27. loadBalancer = r.ARN
  28. }
  29. }
  30. status, err := b.api.DescribeServices(ctx, cluster, servicesARN)
  31. if err != nil {
  32. return nil, err
  33. }
  34. url, err := b.api.GetLoadBalancerURL(ctx, loadBalancer)
  35. if err != nil {
  36. return nil, err
  37. }
  38. for i, state := range status {
  39. s, err := project.GetService(state.Name)
  40. if err != nil {
  41. return nil, err
  42. }
  43. ports := []string{}
  44. for _, p := range s.Ports {
  45. ports = append(ports, fmt.Sprintf("%s:%d->%d/%s", url, p.Published, p.Target, p.Protocol))
  46. }
  47. state.Ports = ports
  48. status[i] = state
  49. }
  50. return status, nil
  51. }