Skip to content
This repository was archived by the owner on Oct 9, 2020. It is now read-only.

Commit 31703ac

Browse files
aiordacheaiordache
authored andcommitted
generic URL/port/protocol retrieval for compose ps
Signed-off-by: aiordache <anca.iordache@docker.com>
1 parent 6629d8e commit 31703ac

4 files changed

Lines changed: 91 additions & 28 deletions

File tree

cmd/commands/compose.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ func PsCommand(dockerCli command.Cli, options *cli.ProjectOptions) *cobra.Comman
9191
}
9292
printSection(os.Stdout, len(status), func(w io.Writer) {
9393
for _, service := range status {
94-
fmt.Fprintf(w, "%s\t%s\t%d/%d\t%s\n", service.ID, service.Name, service.Replicas, service.Desired, strings.Join(service.Ports, " "))
94+
fmt.Fprintf(w, "%s\t%s\t%d/%d\t%s\n", service.ID, service.Name, service.Replicas, service.Desired, strings.Join(service.Ports, ", "))
9595
}
9696
}, "ID", "NAME", "REPLICAS", "PORTS")
9797
return nil

pkg/amazon/backend/list.go

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ func (b *Backend) Ps(ctx context.Context, options cli.ProjectOptions) ([]compose
2121
if err != nil {
2222
return nil, err
2323
}
24-
loadBalancer := parameters[ParameterLoadBalancerARN]
2524
cluster := parameters[ParameterClusterName]
2625

2726
resources, err := b.api.ListStackResources(ctx, projectName)
@@ -30,20 +29,14 @@ func (b *Backend) Ps(ctx context.Context, options cli.ProjectOptions) ([]compose
3029
}
3130

3231
servicesARN := []string{}
33-
targetGroups := []string{}
3432
for _, r := range resources {
3533
switch r.Type {
3634
case "AWS::ECS::Service":
3735
servicesARN = append(servicesARN, r.ARN)
3836
case "AWS::ECS::Cluster":
3937
cluster = r.ARN
40-
case "AWS::ElasticLoadBalancingV2::LoadBalancer":
41-
loadBalancer = r.ARN
42-
case "AWS::ElasticLoadBalancingV2::TargetGroup":
43-
targetGroups = append(targetGroups, r.LogicalID)
4438
}
4539
}
46-
4740
if len(servicesARN) == 0 {
4841
return nil, nil
4942
}
@@ -52,18 +45,15 @@ func (b *Backend) Ps(ctx context.Context, options cli.ProjectOptions) ([]compose
5245
return nil, err
5346
}
5447

55-
url, err := b.api.GetLoadBalancerURL(ctx, loadBalancer)
56-
if err != nil {
57-
return nil, err
58-
}
59-
6048
for i, state := range status {
6149
ports := []string{}
62-
for _, tg := range targetGroups {
63-
groups := targetGroupLogicalName.FindStringSubmatch(tg)
64-
if groups[0] == state.Name {
65-
ports = append(ports, fmt.Sprintf("%s:%s->%s/%s", url, groups[2], groups[2], strings.ToLower(groups[1])))
66-
}
50+
for _, lb := range state.LoadBalancers {
51+
ports = append(ports, fmt.Sprintf(
52+
"%s:%d->%d/%s",
53+
lb.URL,
54+
lb.PublishedPort,
55+
lb.TargetPort,
56+
strings.ToLower(lb.Protocol)))
6757
}
6858
state.Ports = ports
6959
status[i] = state

pkg/amazon/sdk/sdk.go

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ func (s sdk) DescribeServices(ctx context.Context, cluster string, arns []string
449449
if err != nil {
450450
return nil, err
451451
}
452+
452453
status := []compose.ServiceStatus{}
453454
for _, service := range services.Services {
454455
var name string
@@ -460,17 +461,76 @@ func (s sdk) DescribeServices(ctx context.Context, cluster string, arns []string
460461
if name == "" {
461462
return nil, fmt.Errorf("service %s doesn't have a %s tag", *service.ServiceArn, compose.ServiceTag)
462463
}
464+
targetGroupArns := []string{}
465+
for _, lb := range service.LoadBalancers {
466+
targetGroupArns = append(targetGroupArns, *lb.TargetGroupArn)
467+
}
468+
// getURLwithPortMapping makes 2 queries
469+
// one to get the target groups and another for load balancers
470+
loadBalancers, err := s.getURLWithPortMapping(ctx, targetGroupArns)
471+
if err != nil {
472+
return nil, err
473+
}
463474
status = append(status, compose.ServiceStatus{
464-
ID: *service.ServiceName,
465-
Name: name,
466-
Replicas: int(*service.RunningCount),
467-
Desired: int(*service.DesiredCount),
475+
ID: *service.ServiceName,
476+
Name: name,
477+
Replicas: int(*service.RunningCount),
478+
Desired: int(*service.DesiredCount),
479+
LoadBalancers: loadBalancers,
468480
})
469481
}
470-
471482
return status, nil
472483
}
473484

485+
func (s sdk) getURLWithPortMapping(ctx context.Context, targetGroupArns []string) ([]compose.LoadBalancer, error) {
486+
if len(targetGroupArns) == 0 {
487+
return nil, nil
488+
}
489+
groups, err := s.ELB.DescribeTargetGroups(&elbv2.DescribeTargetGroupsInput{
490+
TargetGroupArns: aws.StringSlice(targetGroupArns),
491+
})
492+
if err != nil {
493+
return nil, err
494+
}
495+
lbarns := []*string{}
496+
for _, tg := range groups.TargetGroups {
497+
lbarns = append(lbarns, tg.LoadBalancerArns...)
498+
}
499+
500+
lbs, err := s.ELB.DescribeLoadBalancersWithContext(ctx, &elbv2.DescribeLoadBalancersInput{
501+
LoadBalancerArns: lbarns,
502+
})
503+
504+
if err != nil {
505+
return nil, err
506+
}
507+
filterLB := func(arn *string, lbs []*elbv2.LoadBalancer) *elbv2.LoadBalancer {
508+
for _, lb := range lbs {
509+
if *lb.LoadBalancerArn == *arn {
510+
return lb
511+
}
512+
}
513+
return nil
514+
}
515+
loadBalancers := []compose.LoadBalancer{}
516+
for _, tg := range groups.TargetGroups {
517+
for _, lbarn := range tg.LoadBalancerArns {
518+
lb := filterLB(lbarn, lbs.LoadBalancers)
519+
if lb == nil {
520+
continue
521+
}
522+
loadBalancers = append(loadBalancers, compose.LoadBalancer{
523+
URL: *lb.DNSName,
524+
TargetPort: int(*tg.Port),
525+
PublishedPort: int(*tg.Port),
526+
Protocol: *tg.Protocol,
527+
})
528+
529+
}
530+
}
531+
return loadBalancers, nil
532+
}
533+
474534
func (s sdk) ListTasks(ctx context.Context, cluster string, family string) ([]string, error) {
475535
tasks, err := s.ECS.ListTasksWithContext(ctx, &ecs.ListTasksInput{
476536
Cluster: aws.String(cluster),

pkg/compose/types.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,25 @@ type StackResource struct {
99
Status string
1010
}
1111

12+
type PortMapping struct {
13+
Source int
14+
Target int
15+
}
16+
17+
type LoadBalancer struct {
18+
URL string
19+
TargetPort int
20+
PublishedPort int
21+
Protocol string
22+
}
23+
1224
type ServiceStatus struct {
13-
ID string
14-
Name string
15-
Replicas int
16-
Desired int
17-
Ports []string
25+
ID string
26+
Name string
27+
Replicas int
28+
Desired int
29+
Ports []string
30+
LoadBalancers []LoadBalancer
1831
}
1932

2033
const (

0 commit comments

Comments
 (0)