From 2d78638f26f11c8b0bc04cbc3103c3a88f7016ee Mon Sep 17 00:00:00 2001 From: t-kikuc Date: Tue, 26 Dec 2023 12:41:57 +0900 Subject: [PATCH 1/3] Convert json.RawMessage to struct Signed-off-by: t-kikuc --- .../platformprovider/ecs/target_groups.go | 29 ++++++--------- .../ecs/target_groups_test.go | 35 ++++++++----------- pkg/config/application_ecs.go | 11 ++++-- pkg/config/application_ecs_test.go | 7 ++-- 4 files changed, 39 insertions(+), 43 deletions(-) diff --git a/pkg/app/piped/platformprovider/ecs/target_groups.go b/pkg/app/piped/platformprovider/ecs/target_groups.go index d367fd65c6..850005c785 100644 --- a/pkg/app/piped/platformprovider/ecs/target_groups.go +++ b/pkg/app/piped/platformprovider/ecs/target_groups.go @@ -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" @@ -28,27 +26,22 @@ 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)), } 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)), } } diff --git a/pkg/app/piped/platformprovider/ecs/target_groups_test.go b/pkg/app/piped/platformprovider/ecs/target_groups_test.go index 432ce4d3f9..812270ae61 100644 --- a/pkg/app/piped/platformprovider/ecs/target_groups_test.go +++ b/pkg/app/piped/platformprovider/ecs/target_groups_test.go @@ -42,7 +42,11 @@ 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{ { @@ -57,8 +61,16 @@ 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{ { @@ -74,23 +86,6 @@ func TestLoadTargetGroup(t *testing.T) { }, 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 { diff --git a/pkg/config/application_ecs.go b/pkg/config/application_ecs.go index 14deab78c6..14468e06b6 100644 --- a/pkg/config/application_ecs.go +++ b/pkg/config/application_ecs.go @@ -15,7 +15,6 @@ package config import ( - "encoding/json" "fmt" ) @@ -91,8 +90,14 @@ 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"` } // ECSSyncStageOptions contains all configurable values for a ECS_SYNC stage. diff --git a/pkg/config/application_ecs_test.go b/pkg/config/application_ecs_test.go index 305a4bf437..b4344a0a52 100644 --- a/pkg/config/application_ecs_test.go +++ b/pkg/config/application_ecs_test.go @@ -15,7 +15,6 @@ package config import ( - "encoding/json" "fmt" "testing" "time" @@ -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), From 4404ed12c2c8b85877cf17202e072e53501e85f0 Mon Sep 17 00:00:00 2001 From: t-kikuc Date: Thu, 28 Dec 2023 17:14:04 +0900 Subject: [PATCH 2/3] Add LoadBalancerName to ECSTargetGroup Signed-off-by: t-kikuc --- .../piped/platformprovider/ecs/target_groups.go | 14 ++++++++------ pkg/config/application_ecs.go | 7 ++++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/pkg/app/piped/platformprovider/ecs/target_groups.go b/pkg/app/piped/platformprovider/ecs/target_groups.go index 850005c785..de1a7e1a1c 100644 --- a/pkg/app/piped/platformprovider/ecs/target_groups.go +++ b/pkg/app/piped/platformprovider/ecs/target_groups.go @@ -31,17 +31,19 @@ func loadTargetGroups(targetGroups config.ECSTargetGroups) (*types.LoadBalancer, } primary := &types.LoadBalancer{ - TargetGroupArn: aws.String(targetGroups.Primary.TargetGroupArn), - ContainerName: aws.String(targetGroups.Primary.ContainerName), - ContainerPort: aws.Int32(int32(targetGroups.Primary.ContainerPort)), + 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 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)), + 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), } } diff --git a/pkg/config/application_ecs.go b/pkg/config/application_ecs.go index 14468e06b6..37c90a5eaa 100644 --- a/pkg/config/application_ecs.go +++ b/pkg/config/application_ecs.go @@ -95,9 +95,10 @@ type ECSTargetGroups struct { } type ECSTargetGroup struct { - TargetGroupArn string `json:"targetGroupArn"` - ContainerName string `json:"containerName"` - ContainerPort int `json:"containerPort"` + 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. From 28dfdcea85fb5d6c9210a59923d60a98a3b549e8 Mon Sep 17 00:00:00 2001 From: t-kikuc Date: Thu, 28 Dec 2023 17:31:37 +0900 Subject: [PATCH 3/3] Fix test Signed-off-by: t-kikuc --- .../ecs/target_groups_test.go | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/pkg/app/piped/platformprovider/ecs/target_groups_test.go b/pkg/app/piped/platformprovider/ecs/target_groups_test.go index 812270ae61..8d7808c15b 100644 --- a/pkg/app/piped/platformprovider/ecs/target_groups_test.go +++ b/pkg/app/piped/platformprovider/ecs/target_groups_test.go @@ -50,9 +50,10 @@ func TestLoadTargetGroup(t *testing.T) { }, 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, }, @@ -74,14 +75,16 @@ func TestLoadTargetGroup(t *testing.T) { }, 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,