cloudformation_test.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package amazon
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/awslabs/goformation/v4/cloudformation/ec2"
  6. "github.com/awslabs/goformation/v4/cloudformation"
  7. "github.com/compose-spec/compose-go/loader"
  8. "github.com/compose-spec/compose-go/types"
  9. "gotest.tools/assert"
  10. "github.com/docker/ecs-plugin/pkg/compose"
  11. "gotest.tools/v3/golden"
  12. )
  13. func TestSimpleConvert(t *testing.T) {
  14. project := load(t, "testdata/input/simple-single-service.yaml")
  15. result := convertResultAsString(t, project, "TestCluster")
  16. expected := "simple/simple-cloudformation-conversion.golden"
  17. golden.Assert(t, result, expected)
  18. }
  19. func TestSimpleWithOverrides(t *testing.T) {
  20. project := load(t, "testdata/input/simple-single-service.yaml", "testdata/input/simple-single-service-with-overrides.yaml")
  21. result := convertResultAsString(t, project, "TestCluster")
  22. expected := "simple/simple-cloudformation-with-overrides-conversion.golden"
  23. golden.Assert(t, result, expected)
  24. }
  25. func TestMapNetworksToSecurityGroups(t *testing.T) {
  26. template := convertYaml(t, `
  27. version: "3"
  28. services:
  29. test:
  30. image: hello_world
  31. networks:
  32. front-tier:
  33. name: public
  34. back-tier:
  35. internal: true
  36. `)
  37. assert.Check(t, template.Resources["TestPublicNetwork"] != nil)
  38. assert.Check(t, template.Resources["TestBacktierNetwork"] != nil)
  39. assert.Check(t, template.Resources["TestBacktierNetworkIngress"] != nil)
  40. ingress := template.Resources["TestPublicNetworkIngress"].(*ec2.SecurityGroupIngress)
  41. assert.Check(t, ingress != nil)
  42. assert.Check(t, ingress.SourceSecurityGroupId == cloudformation.Ref("TestPublicNetwork"))
  43. }
  44. func convertResultAsString(t *testing.T, project *compose.Project, clusterName string) string {
  45. client, err := NewClient("", clusterName, "")
  46. assert.NilError(t, err)
  47. result, err := client.Convert(project)
  48. assert.NilError(t, err)
  49. resultAsJSON, err := result.JSON()
  50. assert.NilError(t, err)
  51. return fmt.Sprintf("%s\n", string(resultAsJSON))
  52. }
  53. func load(t *testing.T, paths ...string) *compose.Project {
  54. options := compose.ProjectOptions{
  55. Name: t.Name(),
  56. ConfigPaths: paths,
  57. }
  58. project, err := compose.ProjectFromOptions(&options)
  59. assert.NilError(t, err)
  60. return project
  61. }
  62. func convertYaml(t *testing.T, yaml string) *cloudformation.Template {
  63. dict, err := loader.ParseYAML([]byte(yaml))
  64. assert.NilError(t, err)
  65. model, err := loader.Load(types.ConfigDetails{
  66. ConfigFiles: []types.ConfigFile{
  67. {Config: dict},
  68. },
  69. })
  70. assert.NilError(t, err)
  71. err = compose.Normalize(model)
  72. assert.NilError(t, err)
  73. template, err := client{}.Convert(&compose.Project{
  74. Config: *model,
  75. Name: "test",
  76. })
  77. assert.NilError(t, err)
  78. return template
  79. }