Skip to content

Commit 9c41362

Browse files
committed
Add compose 3 parsing, tests
1 parent 032527b commit 9c41362

File tree

3 files changed

+163
-6
lines changed

3 files changed

+163
-6
lines changed

ecs-cli/modules/cli/compose/containerconfig/containerconfig.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package containerconfig
33
// ContainerConfig all compose fields supported by the ecs-cli
44
// TODO: finalize fields
55
type ContainerConfig struct {
6+
Name string
7+
68
CapAdd []string
79
CapDrop []string
810
Command string // type TBD
Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package project
22

33
import (
4+
"io/ioutil"
5+
"path/filepath"
6+
47
"github.com/aws/amazon-ecs-cli/ecs-cli/modules/cli/compose/containerconfig"
8+
"github.com/pkg/errors"
59
"github.com/sirupsen/logrus"
610

711
"github.com/docker/cli/cli/compose/loader"
@@ -11,20 +15,67 @@ import (
1115
func (p *ecsProject) parseV3() (*[]containerconfig.ContainerConfig, error) {
1216
logrus.Debug("Parsing v3 project...")
1317

14-
// TODO: parse v3, convert ServiceConfigs to ContainerConfigs
15-
configDetails := types.ConfigDetails{}
18+
// load and parse each compose file into a configFile
19+
configFiles := []types.ConfigFile{}
20+
for _, file := range p.ecsContext.ComposeFiles {
21+
22+
loadedFile, err := ioutil.ReadFile(file)
23+
if err != nil {
24+
return nil, err
25+
}
26+
parsedFile, err := loader.ParseYAML(loadedFile)
27+
if err != nil {
28+
return nil, err
29+
}
30+
configFile := types.ConfigFile{
31+
Filename: file,
32+
Config: parsedFile,
33+
}
34+
configFiles = append(configFiles, configFile)
35+
}
36+
37+
wrkDir, err := getWorkingDir(p.ecsContext.ComposeFiles[0])
38+
if err != nil {
39+
return nil, err
40+
}
41+
42+
configDetails := types.ConfigDetails{
43+
WorkingDir: wrkDir,
44+
ConfigFiles: configFiles,
45+
Environment: nil,
46+
}
47+
48+
// load config from config details
1649
config, err := loader.Load(configDetails)
1750
if err != nil {
1851
return nil, err
1952
}
2053

54+
// convert ServiceConfigs to ContainerConfigs
55+
conConfigs := []containerconfig.ContainerConfig{}
2156
for _, service := range config.Services {
22-
convertDockerToContainerConfig(service)
57+
cCon, err := convertToContainerConfig(service)
58+
if err != nil {
59+
return nil, err
60+
}
61+
conConfigs = append(conConfigs, *cCon)
2362
}
2463

25-
return &[]containerconfig.ContainerConfig{}, nil
64+
return &conConfigs, nil
2665
}
2766

28-
func convertDockerToContainerConfig(serviceConfig types.ServiceConfig) {
29-
return
67+
func convertToContainerConfig(serviceConfig types.ServiceConfig) (*containerconfig.ContainerConfig, error) {
68+
//TODO: fully convert ServiceConfig to ContainerConfig
69+
c := &containerconfig.ContainerConfig{
70+
Name: serviceConfig.Name,
71+
}
72+
return c, nil
73+
}
74+
75+
func getWorkingDir(fileName string) (string, error) {
76+
pwd, err := filepath.Abs(fileName)
77+
if err != nil {
78+
return "", errors.Wrap(err, "Unable to retrieve compose file directory")
79+
}
80+
return filepath.Dir(pwd), nil
3081
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package project
2+
3+
import (
4+
"io/ioutil"
5+
"os"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
)
10+
11+
func TestParseV3WithOneFile(t *testing.T) {
12+
// set up file
13+
numOfServices := 2
14+
composeFileString := `version: '3'
15+
services:
16+
wordpress:
17+
image: wordpress
18+
ports: ["80:80"]
19+
mysql:
20+
image: mysql`
21+
22+
tmpfile, err := ioutil.TempFile("", "test")
23+
if err != nil {
24+
t.Fatal("Unexpected error in creating test file: ", err)
25+
}
26+
defer os.Remove(tmpfile.Name())
27+
28+
if _, err := tmpfile.Write([]byte(composeFileString)); err != nil {
29+
t.Fatal("Unexpected error writing to test file: ", err)
30+
}
31+
if err := tmpfile.Close(); err != nil {
32+
t.Fatal("Unexpected error closing test file: ", err)
33+
}
34+
35+
// add files to projects
36+
project := setupTestProject(t)
37+
project.ecsContext.ComposeFiles = append(project.ecsContext.ComposeFiles, tmpfile.Name())
38+
39+
// assert number of container configs matches expected number of services
40+
// TODO: assert containerConfig content after conversion implemented
41+
conConfigResult, err := project.parseV3()
42+
if err != nil {
43+
t.Fatal("Unexpected error parsing file: ", err)
44+
}
45+
assert.Equal(t, numOfServices, len(*conConfigResult))
46+
}
47+
48+
func TestParseV3WithMultileFiles(t *testing.T) {
49+
// set up files
50+
numOfServices := 3
51+
fileString1 := `version: '3'
52+
services:
53+
wordpress:
54+
image: wordpress
55+
ports: ["80:80"]
56+
mysql:
57+
image: mysql`
58+
59+
fileString2 := `version: '3'
60+
services:
61+
redis:
62+
image: redis
63+
ports: ["90:90"]`
64+
65+
// initialize temp files
66+
tmpfile1, err1 := ioutil.TempFile("", "test")
67+
if err1 != nil {
68+
t.Fatal("Unexpected error in creating test file: ", err1)
69+
}
70+
defer os.Remove(tmpfile1.Name())
71+
72+
tmpfile2, err2 := ioutil.TempFile("", "test")
73+
if err2 != nil {
74+
t.Fatal("Unexpected error in creating test file: ", err2)
75+
}
76+
defer os.Remove(tmpfile2.Name())
77+
78+
// write compose contents to files
79+
if _, err := tmpfile1.Write([]byte(fileString1)); err != nil {
80+
t.Fatal("Unexpected error writing to test file: ", err)
81+
}
82+
if err := tmpfile1.Close(); err != nil {
83+
t.Fatal("Unexpected error closing test file: ", err)
84+
}
85+
86+
if _, err := tmpfile2.Write([]byte(fileString2)); err != nil {
87+
t.Fatal("Unexpected error writing to test file: ", err)
88+
}
89+
if err := tmpfile2.Close(); err != nil {
90+
t.Fatal("Unexpected error closing test file: ", err)
91+
}
92+
// add files to projects
93+
project := setupTestProject(t)
94+
project.ecsContext.ComposeFiles = append(project.ecsContext.ComposeFiles, tmpfile1.Name())
95+
project.ecsContext.ComposeFiles = append(project.ecsContext.ComposeFiles, tmpfile2.Name())
96+
97+
// assert number of container configs matches expected number of services
98+
// TODO: assert containerConfig content after conversion implemented
99+
conConfigResult, err := project.parseV3()
100+
if err != nil {
101+
t.Fatal("Unexpected error parsing file: ", err)
102+
}
103+
assert.Equal(t, numOfServices, len(*conConfigResult))
104+
}

0 commit comments

Comments
 (0)