cloudformation_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package amazon
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/aws/aws-sdk-go/service/elbv2"
  6. "github.com/awslabs/goformation/v4/cloudformation"
  7. "github.com/awslabs/goformation/v4/cloudformation/ec2"
  8. "github.com/awslabs/goformation/v4/cloudformation/iam"
  9. "github.com/awslabs/goformation/v4/cloudformation/elasticloadbalancingv2"
  10. "github.com/compose-spec/compose-go/loader"
  11. "github.com/compose-spec/compose-go/types"
  12. "github.com/docker/ecs-plugin/pkg/compose"
  13. "gotest.tools/assert"
  14. "gotest.tools/v3/golden"
  15. )
  16. func TestSimpleConvert(t *testing.T) {
  17. project := load(t, "testdata/input/simple-single-service.yaml")
  18. result := convertResultAsString(t, project, "TestCluster")
  19. expected := "simple/simple-cloudformation-conversion.golden"
  20. golden.Assert(t, result, expected)
  21. }
  22. func TestSimpleWithOverrides(t *testing.T) {
  23. project := load(t, "testdata/input/simple-single-service.yaml", "testdata/input/simple-single-service-with-overrides.yaml")
  24. result := convertResultAsString(t, project, "TestCluster")
  25. expected := "simple/simple-cloudformation-with-overrides-conversion.golden"
  26. golden.Assert(t, result, expected)
  27. }
  28. func TestRolePolicy(t *testing.T) {
  29. template := convertYaml(t, `
  30. version: "3"
  31. services:
  32. foo:
  33. image: hello_world
  34. x-aws-pull_credentials: "secret"
  35. `)
  36. role := template.Resources["FooTaskExecutionRole"].(*iam.Role)
  37. assert.Check(t, role != nil)
  38. assert.Check(t, role.ManagedPolicyArns[0] == ECSTaskExecutionPolicy)
  39. assert.Check(t, role.ManagedPolicyArns[1] == ECRReadOnlyPolicy)
  40. // We expect an extra policy has been created for x-aws-pull_credentials
  41. assert.Check(t, len(role.Policies) == 1)
  42. policy := role.Policies[0].PolicyDocument.(*PolicyDocument)
  43. expected := []string{"secretsmanager:GetSecretValue", "ssm:GetParameters", "kms:Decrypt"}
  44. assert.DeepEqual(t, expected, policy.Statement[0].Action)
  45. assert.DeepEqual(t, []string{"secret"}, policy.Statement[0].Resource)
  46. }
  47. func TestMapNetworksToSecurityGroups(t *testing.T) {
  48. template := convertYaml(t, `
  49. version: "3"
  50. services:
  51. test:
  52. image: hello_world
  53. networks:
  54. front-tier:
  55. name: public
  56. back-tier:
  57. internal: true
  58. `)
  59. assert.Check(t, template.Resources["TestPublicNetwork"] != nil)
  60. assert.Check(t, template.Resources["TestBacktierNetwork"] != nil)
  61. assert.Check(t, template.Resources["TestBacktierNetworkIngress"] != nil)
  62. ingress := template.Resources["TestPublicNetworkIngress"].(*ec2.SecurityGroupIngress)
  63. assert.Check(t, ingress != nil)
  64. assert.Check(t, ingress.SourceSecurityGroupId == cloudformation.Ref("TestPublicNetwork"))
  65. }
  66. func TestLoadBalancerTypeApplication(t *testing.T) {
  67. template := convertYaml(t, `
  68. version: "3"
  69. services:
  70. test:
  71. image: nginx
  72. ports:
  73. - 80:80
  74. `)
  75. lb := template.Resources["TestLoadBalancer"].(*elasticloadbalancingv2.LoadBalancer)
  76. assert.Check(t, lb != nil)
  77. assert.Check(t, lb.Type == elbv2.LoadBalancerTypeEnumApplication)
  78. assert.Check(t, len(lb.SecurityGroups) > 0)
  79. }
  80. func TestLoadBalancerTypeNetwork(t *testing.T) {
  81. template := convertYaml(t, `
  82. version: "3"
  83. services:
  84. test:
  85. image: nginx
  86. ports:
  87. - 80:80
  88. - 88:88
  89. `)
  90. lb := template.Resources["TestLoadBalancer"].(*elasticloadbalancingv2.LoadBalancer)
  91. assert.Check(t, lb != nil)
  92. assert.Check(t, lb.Type == elbv2.LoadBalancerTypeEnumNetwork)
  93. }
  94. func convertResultAsString(t *testing.T, project *compose.Project, clusterName string) string {
  95. client, err := NewClient("", clusterName, "")
  96. assert.NilError(t, err)
  97. result, err := client.Convert(project)
  98. assert.NilError(t, err)
  99. resultAsJSON, err := result.JSON()
  100. assert.NilError(t, err)
  101. return fmt.Sprintf("%s\n", string(resultAsJSON))
  102. }
  103. func load(t *testing.T, paths ...string) *compose.Project {
  104. options := compose.ProjectOptions{
  105. Name: t.Name(),
  106. ConfigPaths: paths,
  107. }
  108. project, err := compose.ProjectFromOptions(&options)
  109. assert.NilError(t, err)
  110. return project
  111. }
  112. func convertYaml(t *testing.T, yaml string) *cloudformation.Template {
  113. dict, err := loader.ParseYAML([]byte(yaml))
  114. assert.NilError(t, err)
  115. model, err := loader.Load(types.ConfigDetails{
  116. ConfigFiles: []types.ConfigFile{
  117. {Config: dict},
  118. },
  119. })
  120. assert.NilError(t, err)
  121. err = compose.Normalize(model)
  122. assert.NilError(t, err)
  123. template, err := client{}.Convert(&compose.Project{
  124. Config: *model,
  125. Name: "test",
  126. })
  127. assert.NilError(t, err)
  128. return template
  129. }