Skip to content

Commit 37b569f

Browse files
authored
chore(manifest): move more validation from template pkg (#2878)
<!-- Provide summary of changes --> Part of #2818. This PR adds validation for - task def override - sidecar mount points - storage config - publish/subscribe Also make `topic.queue` to able to accept either bool or map as input so as users can better specify a topic specific queue with default config. <!-- Issue number, if available. E.g. "Fixes #31", "Addresses #42, 77" --> By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the Apache 2.0 License.
1 parent 4b9ee59 commit 37b569f

File tree

20 files changed

+809
-293
lines changed

20 files changed

+809
-293
lines changed

internal/pkg/cli/svc_deploy.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -899,11 +899,11 @@ func (o *deploySvcOpts) buildWorkerQueueNames() string {
899899
sb := new(strings.Builder)
900900
first := true
901901
for _, subscription := range o.subscriptions {
902-
if subscription.Queue == nil {
902+
if subscription.Queue.IsEmpty() {
903903
continue
904904
}
905-
topicSvc := template.StripNonAlphaNumFunc(subscription.Service)
906-
topicName := template.StripNonAlphaNumFunc(subscription.Name)
905+
topicSvc := template.StripNonAlphaNumFunc(aws.StringValue(subscription.Service))
906+
topicName := template.StripNonAlphaNumFunc(aws.StringValue(subscription.Name))
907907
subName := fmt.Sprintf("%s%sEventsQueue", topicSvc, strings.Title(topicName))
908908
if first {
909909
sb.WriteString(subName)

internal/pkg/cli/svc_init.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"strconv"
1010

11+
"github.com/aws/aws-sdk-go/aws"
1112
"github.com/aws/copilot-cli/internal/pkg/docker/dockerfile"
1213

1314
"github.com/aws/copilot-cli/internal/pkg/docker/dockerengine"
@@ -484,8 +485,8 @@ func (o *initSvcOpts) askSvcPublishers() (err error) {
484485
subscriptions := make([]manifest.TopicSubscription, 0, len(topics))
485486
for _, t := range topics {
486487
subscriptions = append(subscriptions, manifest.TopicSubscription{
487-
Name: t.Name(),
488-
Service: t.Workload(),
488+
Name: aws.String(t.Name()),
489+
Service: aws.String(t.Workload()),
489490
})
490491
}
491492
o.topics = subscriptions
@@ -500,8 +501,8 @@ func parseSerializedSubscription(input string) (manifest.TopicSubscription, erro
500501
return manifest.TopicSubscription{}, fmt.Errorf("parse subscription from key: %s", input)
501502
}
502503
return manifest.TopicSubscription{
503-
Name: attrs[2],
504-
Service: attrs[1],
504+
Name: aws.String(attrs[2]),
505+
Service: aws.String(attrs[1]),
505506
}, nil
506507
}
507508

internal/pkg/cli/svc_init_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"testing"
1010

11+
"github.com/aws/aws-sdk-go/aws"
1112
"github.com/aws/copilot-cli/internal/pkg/docker/dockerfile"
1213

1314
"github.com/aws/copilot-cli/internal/pkg/deploy"
@@ -695,8 +696,8 @@ func TestSvcInitOpts_Execute(t *testing.T) {
695696
gomock.Any(),
696697
).Return([]manifest.TopicSubscription{
697698
{
698-
Name: "thetopic",
699-
Service: "theservice",
699+
Name: aws.String("thetopic"),
700+
Service: aws.String("theservice"),
700701
},
701702
}, nil)
702703
},

internal/pkg/cli/validate.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616

1717
"github.com/spf13/afero"
1818

19+
"github.com/aws/aws-sdk-go/aws"
1920
"github.com/aws/aws-sdk-go/aws/arn"
2021
"github.com/aws/copilot-cli/internal/pkg/addon"
2122
"github.com/aws/copilot-cli/internal/pkg/aws/apprunner"
@@ -678,13 +679,11 @@ func validateSubscriptionKey(val interface{}) error {
678679
if err != nil {
679680
return errSubscribeBadFormat
680681
}
681-
err = validatePubSubName(sub.Name)
682-
if err != nil {
683-
return fmt.Errorf("invalid topic subscription topic name `%s`: %w", sub.Name, err)
682+
if err := validatePubSubName(aws.StringValue(sub.Name)); err != nil {
683+
return fmt.Errorf("invalid topic subscription topic name `%s`: %w", aws.StringValue(sub.Name), err)
684684
}
685-
err = basicNameValidation(sub.Service)
686-
if err != nil {
687-
return fmt.Errorf("invalid topic subscription service name `%s`: %w", sub.Service, err)
685+
if err = basicNameValidation(aws.StringValue(sub.Service)); err != nil {
686+
return fmt.Errorf("invalid topic subscription service name `%s`: %w", aws.StringValue(sub.Service), err)
688687
}
689688
return nil
690689
}
@@ -715,7 +714,7 @@ func validateTopicsExist(subscriptions []manifest.TopicSubscription, topicARNs [
715714
}
716715

717716
for _, ts := range subscriptions {
718-
topicName := fmt.Sprintf(resourceNameFormat, app, env, ts.Service, ts.Name)
717+
topicName := fmt.Sprintf(resourceNameFormat, app, env, aws.StringValue(ts.Service), aws.StringValue(ts.Name))
719718
if !contains(topicName, validTopicResources) {
720719
return fmt.Errorf(fmtErrTopicSubscriptionNotAllowed, topicName, env)
721720
}

internal/pkg/cli/validate_test.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"testing"
1111
"time"
1212

13+
"github.com/aws/aws-sdk-go/aws"
1314
"github.com/aws/copilot-cli/internal/pkg/manifest"
1415

1516
"github.com/spf13/afero"
@@ -796,14 +797,16 @@ func Test_validateTopicsExist(t *testing.T) {
796797
duration10Hours := 10 * time.Hour
797798
testGoodTopics := []manifest.TopicSubscription{
798799
{
799-
Name: "events",
800-
Service: "database",
800+
Name: aws.String("events"),
801+
Service: aws.String("database"),
801802
},
802803
{
803-
Name: "orders",
804-
Service: "database",
805-
Queue: &manifest.SQSQueue{
806-
Retention: &duration10Hours,
804+
Name: aws.String("orders"),
805+
Service: aws.String("database"),
806+
Queue: manifest.SQSQueueOrBool{
807+
Advanced: manifest.SQSQueue{
808+
Retention: &duration10Hours,
809+
},
807810
},
808811
},
809812
}

internal/pkg/deploy/cloudformation/stack/transformers.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -723,22 +723,28 @@ func convertSubscribe(s manifest.SubscribeConfig, validTopicARNs []string, accou
723723
func convertTopicSubscription(t manifest.TopicSubscription, url, accountID, app, env, svc string) (*template.TopicSubscription, error) {
724724
err := validateTopicSubscription(t)
725725
if err != nil {
726-
return nil, fmt.Errorf(`invalid topic subscription "%s": %w`, t.Name, err)
726+
return nil, fmt.Errorf(`invalid topic subscription "%s": %w`, aws.StringValue(t.Name), err)
727727
}
728-
queue, err := convertQueue(t.Queue)
728+
if aws.BoolValue(t.Queue.Enabled) {
729+
return &template.TopicSubscription{
730+
Name: t.Name,
731+
Service: t.Service,
732+
Queue: &template.SQSQueue{},
733+
}, nil
734+
}
735+
queue, err := convertQueue(t.Queue.Advanced)
729736
if err != nil {
730-
return nil, fmt.Errorf(`invalid topic subscription "%s": %w`, t.Name, err)
737+
return nil, fmt.Errorf(`invalid topic subscription "%s": %w`, aws.StringValue(t.Name), err)
731738
}
732-
733739
return &template.TopicSubscription{
734-
Name: aws.String(t.Name),
735-
Service: aws.String(t.Service),
740+
Name: t.Name,
741+
Service: t.Service,
736742
Queue: queue,
737743
}, nil
738744
}
739745

740-
func convertQueue(q *manifest.SQSQueue) (*template.SQSQueue, error) {
741-
if q == nil {
746+
func convertQueue(q manifest.SQSQueue) (*template.SQSQueue, error) {
747+
if q.IsEmpty() {
742748
return nil, nil
743749
}
744750
retention, err := convertRetention(q.Retention)

internal/pkg/deploy/cloudformation/stack/transformers_test.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,11 +1661,11 @@ func Test_convertSubscribe(t *testing.T) {
16611661
inSubscribe: manifest.SubscribeConfig{
16621662
Topics: []manifest.TopicSubscription{
16631663
{
1664-
Name: "name",
1665-
Service: "svc",
1664+
Name: aws.String("name"),
1665+
Service: aws.String("svc"),
16661666
},
16671667
},
1668-
Queue: &manifest.SQSQueue{
1668+
Queue: manifest.SQSQueue{
16691669
Retention: &duration111Seconds,
16701670
Delay: &duration111Seconds,
16711671
Timeout: &duration111Seconds,
@@ -1695,28 +1695,32 @@ func Test_convertSubscribe(t *testing.T) {
16951695
inSubscribe: manifest.SubscribeConfig{
16961696
Topics: []manifest.TopicSubscription{
16971697
{
1698-
Name: "name",
1699-
Service: "svc",
1698+
Name: aws.String("name"),
1699+
Service: aws.String("svc"),
1700+
Queue: manifest.SQSQueueOrBool{
1701+
Enabled: aws.Bool(true),
1702+
},
17001703
},
17011704
},
1702-
Queue: &manifest.SQSQueue{},
1705+
Queue: manifest.SQSQueue{},
17031706
},
17041707
wanted: &template.SubscribeOpts{
17051708
Topics: []*template.TopicSubscription{
17061709
{
17071710
Name: aws.String("name"),
17081711
Service: aws.String("svc"),
1712+
Queue: &template.SQSQueue{},
17091713
},
17101714
},
1711-
Queue: &template.SQSQueue{},
1715+
Queue: nil,
17121716
},
17131717
},
17141718
"invalid topic name": {
17151719
inSubscribe: manifest.SubscribeConfig{
17161720
Topics: []manifest.TopicSubscription{
17171721
{
1718-
Name: "t@p!c1~",
1719-
Service: "service1",
1722+
Name: aws.String("t@p!c1~"),
1723+
Service: aws.String("service1"),
17201724
},
17211725
},
17221726
},
@@ -1726,8 +1730,8 @@ func Test_convertSubscribe(t *testing.T) {
17261730
inSubscribe: manifest.SubscribeConfig{
17271731
Topics: []manifest.TopicSubscription{
17281732
{
1729-
Name: "topic1",
1730-
Service: "s#rv!ce1~",
1733+
Name: aws.String("topic1"),
1734+
Service: aws.String("s#rv!ce1~"),
17311735
},
17321736
},
17331737
},
@@ -1737,11 +1741,11 @@ func Test_convertSubscribe(t *testing.T) {
17371741
inSubscribe: manifest.SubscribeConfig{
17381742
Topics: []manifest.TopicSubscription{
17391743
{
1740-
Name: "name",
1741-
Service: "svc",
1744+
Name: aws.String("name"),
1745+
Service: aws.String("svc"),
17421746
},
17431747
},
1744-
Queue: &manifest.SQSQueue{
1748+
Queue: manifest.SQSQueue{
17451749
Delay: &duration5Days,
17461750
},
17471751
},

internal/pkg/deploy/cloudformation/stack/validate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,11 +444,11 @@ func isCorrectSvcNameFormat(s string) bool {
444444
}
445445

446446
func validateTopicSubscription(ts manifest.TopicSubscription) error {
447-
if err := validatePubSubName(ts.Name); err != nil {
447+
if err := validatePubSubName(aws.StringValue(ts.Name)); err != nil {
448448
return err
449449
}
450450

451-
if err := validateSvcName(ts.Service); err != nil {
451+
if err := validateSvcName(aws.StringValue(ts.Service)); err != nil {
452452
return err
453453
}
454454

internal/pkg/deploy/cloudformation/stack/validate_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -533,20 +533,20 @@ func TestValidateTopicSubscription(t *testing.T) {
533533
}{
534534
"good case": {
535535
inTS: manifest.TopicSubscription{
536-
Name: "name2",
537-
Service: "svc",
536+
Name: aws.String("name2"),
537+
Service: aws.String("svc"),
538538
},
539539
wantErr: nil,
540540
},
541541
"empty name": {
542542
inTS: manifest.TopicSubscription{
543-
Service: "svc",
543+
Service: aws.String("svc"),
544544
},
545545
wantErr: errMissingPublishTopicField,
546546
},
547547
"empty svc name": {
548548
inTS: manifest.TopicSubscription{
549-
Name: "theName",
549+
Name: aws.String("theName"),
550550
},
551551
wantErr: errInvalidSvcName,
552552
},

internal/pkg/deploy/cloudformation/stack/worker_svc_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ Outputs:
108108
testWorkerSvcManifestWithBadSubscribe.Subscribe = manifest.SubscribeConfig{
109109
Topics: []manifest.TopicSubscription{
110110
{
111-
Name: "name",
112-
Service: "un@cept#ble",
111+
Name: aws.String("name"),
112+
Service: aws.String("un@cept#ble"),
113113
},
114114
},
115115
}

0 commit comments

Comments
 (0)