Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 13 additions & 18 deletions pkg/app/piped/platformprovider/ecs/target_groups.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,9 @@
package ecs

import (
"bytes"
"encoding/json"
"errors"
"fmt"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ecs/types"

"github.com/pipe-cd/pipecd/pkg/config"
Expand All @@ -28,27 +26,24 @@ import (
var ErrNoTargetGroup = errors.New("no target group")

func loadTargetGroups(targetGroups config.ECSTargetGroups) (*types.LoadBalancer, *types.LoadBalancer, error) {
if len(targetGroups.Primary) == 0 {
if targetGroups.Primary == nil {
return nil, nil, ErrNoTargetGroup
}

// Decode Primary target group config.
primary := &types.LoadBalancer{}
primaryDecoder := json.NewDecoder(bytes.NewReader(targetGroups.Primary))
primaryDecoder.DisallowUnknownFields()
err := primaryDecoder.Decode(primary)
if err != nil {
return nil, nil, fmt.Errorf("invalid primary target group definition given: %v", err)
primary := &types.LoadBalancer{
TargetGroupArn: aws.String(targetGroups.Primary.TargetGroupArn),
ContainerName: aws.String(targetGroups.Primary.ContainerName),
ContainerPort: aws.Int32(int32(targetGroups.Primary.ContainerPort)),
LoadBalancerName: aws.String(targetGroups.Primary.LoadBalancerName),
}

var canary *types.LoadBalancer
if len(targetGroups.Canary) > 0 {
canaryDecoder := json.NewDecoder(bytes.NewReader(targetGroups.Canary))
canaryDecoder.DisallowUnknownFields()
canary = &types.LoadBalancer{}
err := canaryDecoder.Decode(canary)
if err != nil {
return nil, nil, fmt.Errorf("invalid canary target group definition given: %v", err)
if targetGroups.Canary != nil {
canary = &types.LoadBalancer{
TargetGroupArn: aws.String(targetGroups.Canary.TargetGroupArn),
ContainerName: aws.String(targetGroups.Canary.ContainerName),
ContainerPort: aws.Int32(int32(targetGroups.Canary.ContainerPort)),
LoadBalancerName: aws.String(targetGroups.Canary.LoadBalancerName),
}
}

Expand Down
56 changes: 27 additions & 29 deletions pkg/app/piped/platformprovider/ecs/target_groups_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,18 @@ func TestLoadTargetGroup(t *testing.T) {
{
name: "primary target group only",
cfg: config.ECSTargetGroups{
Primary: []byte(`{"targetGroupArn": "primary-target-group-arn", "containerName": "primary-container-name", "containerPort": 80}`),
Primary: &config.ECSTargetGroup{
TargetGroupArn: "primary-target-group-arn",
ContainerName: "primary-container-name",
ContainerPort: 80,
},
},
expected: []*types.LoadBalancer{
{
TargetGroupArn: aws.String("primary-target-group-arn"),
ContainerName: aws.String("primary-container-name"),
ContainerPort: aws.Int32(80),
TargetGroupArn: aws.String("primary-target-group-arn"),
ContainerName: aws.String("primary-container-name"),
ContainerPort: aws.Int32(80),
LoadBalancerName: aws.String(""),
},
nil,
},
Expand All @@ -57,40 +62,33 @@ func TestLoadTargetGroup(t *testing.T) {
{
name: "primary and canary target group",
cfg: config.ECSTargetGroups{
Primary: []byte(`{"targetGroupArn": "primary-target-group-arn", "containerName": "primary-container-name", "containerPort": 80}`),
Canary: []byte(`{"targetGroupArn": "canary-target-group-arn", "containerName": "canary-container-name", "containerPort": 80}`),
Primary: &config.ECSTargetGroup{
TargetGroupArn: "primary-target-group-arn",
ContainerName: "primary-container-name",
ContainerPort: 80,
},
Canary: &config.ECSTargetGroup{
TargetGroupArn: "canary-target-group-arn",
ContainerName: "canary-container-name",
ContainerPort: 80,
},
},
expected: []*types.LoadBalancer{
{
TargetGroupArn: aws.String("primary-target-group-arn"),
ContainerName: aws.String("primary-container-name"),
ContainerPort: aws.Int32(80),
TargetGroupArn: aws.String("primary-target-group-arn"),
ContainerName: aws.String("primary-container-name"),
ContainerPort: aws.Int32(80),
LoadBalancerName: aws.String(""),
},
{
TargetGroupArn: aws.String("canary-target-group-arn"),
ContainerName: aws.String("canary-container-name"),
ContainerPort: aws.Int32(80),
TargetGroupArn: aws.String("canary-target-group-arn"),
ContainerName: aws.String("canary-container-name"),
ContainerPort: aws.Int32(80),
LoadBalancerName: aws.String(""),
},
},
expectedErr: false,
},
{
name: "invalid primary target group",
cfg: config.ECSTargetGroups{
Primary: []byte(`{"invalidField": "primary-target-group-arn"}`),
},
expected: []*types.LoadBalancer{nil, nil},
expectedErr: true,
},
{
name: "invalid canary target group",
cfg: config.ECSTargetGroups{
Primary: []byte(`{"targetGroupArn": "primary-target-group-arn"`),
Canary: []byte(`{"invalidField": "canary-target-group-arn"}`),
},
expected: []*types.LoadBalancer{nil, nil},
expectedErr: true,
},
}

for _, tc := range testcases {
Expand Down
12 changes: 9 additions & 3 deletions pkg/config/application_ecs.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
package config

import (
"encoding/json"
"fmt"
)

Expand Down Expand Up @@ -91,8 +90,15 @@ type ECSVpcConfiguration struct {
}

type ECSTargetGroups struct {
Primary json.RawMessage `json:"primary"`
Canary json.RawMessage `json:"canary"`
Primary *ECSTargetGroup `json:"primary"`
Canary *ECSTargetGroup `json:"canary"`
}

type ECSTargetGroup struct {
TargetGroupArn string `json:"targetGroupArn"`
ContainerName string `json:"containerName"`
ContainerPort int `json:"containerPort"`
LoadBalancerName string `json:"loadBalancerName"`
}

// ECSSyncStageOptions contains all configurable values for a ECS_SYNC stage.
Expand Down
7 changes: 5 additions & 2 deletions pkg/config/application_ecs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
package config

import (
"encoding/json"
"fmt"
"testing"
"time"
Expand Down Expand Up @@ -60,7 +59,11 @@ func TestECSApplicationConfig(t *testing.T) {
ServiceDefinitionFile: "/path/to/servicedef.yaml",
TaskDefinitionFile: "/path/to/taskdef.yaml",
TargetGroups: ECSTargetGroups{
Primary: json.RawMessage(`{"containerName":"web","containerPort":80,"targetGroupArn":"arn:aws:elasticloadbalancing:xyz"}`),
Primary: &ECSTargetGroup{
TargetGroupArn: "arn:aws:elasticloadbalancing:xyz",
ContainerName: "web",
ContainerPort: 80,
},
},
LaunchType: "FARGATE",
AutoRollback: newBoolPointer(true),
Expand Down