compose/ecs/pkg/amazon/backend/list.go

64 lines
1.5 KiB
Go

package backend
import (
"context"
"fmt"
"sort"
"strings"
"github.com/docker/ecs-plugin/pkg/amazon/types"
"github.com/docker/ecs-plugin/pkg/compose"
)
func (b *Backend) Ps(ctx context.Context, project *compose.Project) ([]types.TaskStatus, error) {
cluster := b.Cluster
if cluster == "" {
cluster = project.Name
}
arns := []string{}
for _, service := range project.Services {
tasks, err := b.api.ListTasks(ctx, cluster, service.Name)
if err != nil {
return []types.TaskStatus{}, err
}
arns = append(arns, tasks...)
}
if len(arns) == 0 {
return []types.TaskStatus{}, nil
}
tasks, err := b.api.DescribeTasks(ctx, cluster, arns...)
if err != nil {
return []types.TaskStatus{}, err
}
networkInterfaces := []string{}
for _, t := range tasks {
if t.NetworkInterface != "" {
networkInterfaces = append(networkInterfaces, t.NetworkInterface)
}
}
publicIps, err := b.api.GetPublicIPs(ctx, networkInterfaces...)
if err != nil {
return []types.TaskStatus{}, err
}
sort.Slice(tasks, func(i, j int) bool {
return strings.Compare(tasks[i].Service, tasks[j].Service) < 0
})
for i, t := range tasks {
ports := []string{}
s, err := project.GetService(t.Service)
if err != nil {
return []types.TaskStatus{}, err
}
for _, p := range s.Ports {
ports = append(ports, fmt.Sprintf("%s:%d->%d/%s", publicIps[t.NetworkInterface], p.Published, p.Target, p.Protocol))
}
tasks[i].Name = s.Name
tasks[i].Ports = ports
}
return tasks, nil
}