cloudformation_test.go 4.3 KB

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