cloudformation_test.go 3.4 KB

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