Skip to content

Commit 6e726b5

Browse files
committed
Return error for no compose files, refactor project tests to use temp files
1 parent 3f99780 commit 6e726b5

File tree

6 files changed

+227
-36
lines changed

6 files changed

+227
-36
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,15 +149,17 @@ func (p *ecsProject) parseCompose() error {
149149
}
150150
switch version {
151151
case "", "1", "1.0", "2", "2.0":
152-
p.containerConfigs, err = p.parseV1V2()
152+
configs, err := p.parseV1V2()
153153
if err != nil {
154154
return err
155155
}
156+
p.containerConfigs = *configs
156157
case "3", "3.0":
157-
p.containerConfigs, err = p.parseV3()
158+
configs, err := p.parseV3()
158159
if err != nil {
159160
return err
160161
}
162+
p.containerConfigs = *configs
161163
default:
162164
return fmt.Errorf("Unsupported Docker Compose version found: %s", version)
163165
}

ecs-cli/modules/cli/compose/project/project_parseV1V2.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import (
66
"github.com/sirupsen/logrus"
77
)
88

9-
func (p *ecsProject) parseV1V2() ([]containerconfig.ContainerConfig, error) {
9+
func (p *ecsProject) parseV1V2() (*[]containerconfig.ContainerConfig, error) {
1010
libProject := project.NewProject(&p.ecsContext.Context, nil, nil)
11-
libProject.Parse()
11+
if err := libProject.Parse(); err != nil {
12+
return nil, err
13+
}
1214

1315
logrus.Debug("Parsing v1/2 project...")
1416

1517
//TODO: convert parsed project.ServiceConfigs to ContainerConfigs
16-
return []containerconfig.ContainerConfig{}, nil
18+
return &[]containerconfig.ContainerConfig{}, nil
1719
}

ecs-cli/modules/cli/compose/project/project_parseV3.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import (
55
"github.com/sirupsen/logrus"
66
)
77

8-
func (p *ecsProject) parseV3() ([]containerconfig.ContainerConfig, error) {
8+
func (p *ecsProject) parseV3() (*[]containerconfig.ContainerConfig, error) {
99
logrus.Debug("Parsing v3 project...")
1010

1111
// TODO: parse v3, convert ServiceConfigs to ContainerConfigs
12-
return []containerconfig.ContainerConfig{}, nil
12+
return &[]containerconfig.ContainerConfig{}, nil
1313
}

ecs-cli/modules/cli/compose/project/project_test.go

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,20 @@ redis:
105105
image: redis`
106106

107107
// setup project and parse
108-
composeBytes := [][]byte{}
109-
composeBytes = append(composeBytes, []byte(composeFileString))
108+
tmpfile, err := ioutil.TempFile("", "test")
109+
if err != nil {
110+
t.Fatal("Unexpected error in creating test file", err)
111+
}
112+
defer os.Remove(tmpfile.Name())
113+
114+
if _, err := tmpfile.Write([]byte(composeFileString)); err != nil {
115+
t.Fatal("Unexpected error writing to test file: ", err)
116+
}
117+
if err := tmpfile.Close(); err != nil {
118+
t.Fatal("Unexpected error closing test file: ", err)
119+
}
110120
project := setupTestProject(t)
111-
project.ecsContext.ComposeBytes = composeBytes
121+
project.ecsContext.ComposeFiles = append(project.ecsContext.ComposeFiles, tmpfile.Name())
112122

113123
if err := project.parseCompose(); err != nil {
114124
t.Fatalf("Unexpected error parsing the compose string [%s]: %v", composeFileString, err)
@@ -234,10 +244,20 @@ volumes:
234244
banana:`
235245

236246
// setup project and parse
237-
composeBytes := [][]byte{}
238-
composeBytes = append(composeBytes, []byte(composeFileString))
247+
tmpfile, err := ioutil.TempFile("", "test")
248+
if err != nil {
249+
t.Fatal("Unexpected error in creating test file: ", err)
250+
}
251+
defer os.Remove(tmpfile.Name())
252+
253+
if _, err := tmpfile.Write([]byte(composeFileString)); err != nil {
254+
t.Fatal("Unexpected error writing to test file: ", err)
255+
}
256+
if err := tmpfile.Close(); err != nil {
257+
t.Fatal("Unexpected error closing test file: ", err)
258+
}
239259
project := setupTestProject(t)
240-
project.ecsContext.ComposeBytes = composeBytes
260+
project.ecsContext.ComposeFiles = append(project.ecsContext.ComposeFiles, tmpfile.Name())
241261

242262
if err := project.parseCompose(); err != nil {
243263
t.Fatalf("Unexpected error parsing the compose string [%s]: %v", composeFileString, err)
@@ -288,10 +308,20 @@ func TestParseComposeForVersion1WithEnvFile(t *testing.T) {
288308
- ` + envFile.Name()
289309

290310
// setup project and parse
291-
composeBytes := [][]byte{}
292-
composeBytes = append(composeBytes, []byte(composeFileString))
311+
tmpfile, err := ioutil.TempFile("", "test")
312+
if err != nil {
313+
t.Fatal("Unexpected error in creating test file", err)
314+
}
315+
defer os.Remove(tmpfile.Name())
316+
317+
if _, err := tmpfile.Write([]byte(composeFileString)); err != nil {
318+
t.Fatal("Unexpected error writing to test file: ", err)
319+
}
320+
if err := tmpfile.Close(); err != nil {
321+
t.Fatal("Unexpected error closing test file: ", err)
322+
}
293323
project := setupTestProject(t)
294-
project.ecsContext.ComposeBytes = composeBytes
324+
project.ecsContext.ComposeFiles = append(project.ecsContext.ComposeFiles, tmpfile.Name())
295325

296326
if err := project.parseCompose(); err != nil {
297327
t.Fatalf("Unexpected error parsing the compose string [%s]: %v", composeFileString, err)
@@ -446,8 +476,12 @@ services:
446476
t.Fatal("Unexpected error in creating test file", err)
447477
}
448478
defer os.Remove(tmpfile.Name())
449-
tmpfile.Write([]byte(composeFileString))
450-
tmpfile.Close()
479+
if _, err := tmpfile.Write([]byte(composeFileString)); err != nil {
480+
t.Fatal("Unexpected error writing to test file: ", err)
481+
}
482+
if err := tmpfile.Close(); err != nil {
483+
t.Fatal("Unexpected error closing test file: ", err)
484+
}
451485

452486
// set up project and parse
453487
project := setupTestProject(t)

ecs-cli/modules/cli/compose/project/project_version.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package project
33
import (
44
"fmt"
55
"io/ioutil"
6+
"regexp"
7+
"strconv"
68

79
"github.com/pkg/errors"
810
"github.com/sirupsen/logrus"
@@ -12,7 +14,7 @@ import (
1214
func (p *ecsProject) checkComposeVersion() (string, error) {
1315
var composeVersion string
1416
if len(p.ecsContext.ComposeFiles) == 0 {
15-
logrus.Error("No Compose files found.")
17+
return "", fmt.Errorf("No Compose files found")
1618
}
1719
for _, file := range p.ecsContext.ComposeFiles {
1820
fileVersion, err := getFileVersion(file)
@@ -24,6 +26,19 @@ func (p *ecsProject) checkComposeVersion() (string, error) {
2426
}
2527
composeVersion = fileVersion
2628
}
29+
30+
// if minor version of 1 or 2 found, log warning
31+
match, _ := regexp.MatchString("^.+\\..", composeVersion)
32+
if composeVersion != "" && match {
33+
versionNumber, err := strconv.ParseFloat(composeVersion, 64)
34+
if err != nil {
35+
return "", err
36+
}
37+
if 0 < versionNumber && versionNumber < 3 {
38+
logrus.Warnf("Minor version (%s) detected. Please format to include only major version (%d).", composeVersion, int(versionNumber))
39+
}
40+
}
41+
2742
return composeVersion, nil
2843
}
2944

ecs-cli/modules/cli/compose/project/project_version_test.go

Lines changed: 155 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,16 @@ services:
2222
// set up compose file
2323
tmpfile, err := ioutil.TempFile("", "test")
2424
if err != nil {
25-
t.Fatal("Unexpected error in creating test file", err)
25+
t.Fatal("Unexpected error in creating test file: ", err)
2626
}
2727
defer os.Remove(tmpfile.Name())
2828

29-
tmpfile.Write([]byte(composeFileString))
30-
tmpfile.Close()
29+
if _, err := tmpfile.Write([]byte(composeFileString)); err != nil {
30+
t.Fatal("Unexpected error writing to test file: ", err)
31+
}
32+
if err := tmpfile.Close(); err != nil {
33+
t.Fatal("Unexpected error closing test file: ", err)
34+
}
3135

3236
// setup project and parse
3337
project := setupTestProject(t)
@@ -57,22 +61,30 @@ services:
5761
// initialize temp files
5862
tmpfile1, err1 := ioutil.TempFile("", "test")
5963
if err1 != nil {
60-
t.Fatal("Unexpected error in creating test file", err1)
64+
t.Fatal("Unexpected error in creating test file: ", err1)
6165
}
6266
defer os.Remove(tmpfile1.Name())
6367

6468
tmpfile2, err2 := ioutil.TempFile("", "test")
6569
if err2 != nil {
66-
t.Fatal("Unexpected error in creating test file", err2)
70+
t.Fatal("Unexpected error in creating test file: ", err2)
6771
}
6872
defer os.Remove(tmpfile2.Name())
6973

70-
// write compose contents to file
71-
tmpfile1.Write([]byte(firstFileString))
72-
tmpfile1.Close()
74+
// write compose contents to files
75+
if _, err := tmpfile1.Write([]byte(firstFileString)); err != nil {
76+
t.Fatal("Unexpected error writing to test file: ", err)
77+
}
78+
if err := tmpfile1.Close(); err != nil {
79+
t.Fatal("Unexpected error closing test file: ", err)
80+
}
7381

74-
tmpfile2.Write([]byte(secondFileString))
75-
tmpfile2.Close()
82+
if _, err := tmpfile2.Write([]byte(secondFileString)); err != nil {
83+
t.Fatal("Unexpected error writing to test file: ", err)
84+
}
85+
if err := tmpfile2.Close(); err != nil {
86+
t.Fatal("Unexpected error closing test file: ", err)
87+
}
7688

7789
// setup project and check file version(s)
7890
project := setupTestProject(t)
@@ -102,21 +114,147 @@ services:
102114
// initialize temp files
103115
tmpfile1, err1 := ioutil.TempFile("", "test")
104116
if err1 != nil {
105-
t.Fatal("Unexpected error in creating test file", err1)
117+
t.Fatal("Unexpected error in creating test file: ", err1)
118+
}
119+
defer os.Remove(tmpfile1.Name())
120+
121+
tmpfile2, err2 := ioutil.TempFile("", "test")
122+
if err2 != nil {
123+
t.Fatal("Unexpected error in creating test file: ", err2)
124+
}
125+
defer os.Remove(tmpfile2.Name())
126+
127+
// write compose contents to files
128+
if _, err := tmpfile1.Write([]byte(version3FileString)); err != nil {
129+
t.Fatal("Unexpected error writing to test file: ", err)
130+
}
131+
if err := tmpfile1.Close(); err != nil {
132+
t.Fatal("Unexpected error closing test file: ", err)
133+
}
134+
135+
if _, err := tmpfile2.Write([]byte(version2FileString)); err != nil {
136+
t.Fatal("Unexpected error writing to test file: ", err)
137+
}
138+
if err := tmpfile2.Close(); err != nil {
139+
t.Fatal("Unexpected error closing test file: ", err)
140+
}
141+
142+
// setup project and check that error is thrown for mismatches file versions
143+
project := setupTestProject(t)
144+
project.ecsContext.ComposeFiles = append(project.ecsContext.ComposeFiles, tmpfile1.Name())
145+
project.ecsContext.ComposeFiles = append(project.ecsContext.ComposeFiles, tmpfile2.Name())
146+
_, error := project.checkComposeVersion()
147+
148+
assert.Error(t, error)
149+
}
150+
151+
func TestCheckComposeVersionWhenEmpty(t *testing.T) {
152+
testVersion := ""
153+
composeFileString := `version: '` + testVersion + `'
154+
services:
155+
wordpress:
156+
image: wordpress
157+
ports: ["80:80"]
158+
mem_reservation: 500000000
159+
mysql:
160+
image: mysql`
161+
162+
// set up compose file
163+
tmpfile, err := ioutil.TempFile("", "test")
164+
if err != nil {
165+
t.Fatal("Unexpected error in creating test file: ", err)
166+
}
167+
defer os.Remove(tmpfile.Name())
168+
169+
if _, err := tmpfile.Write([]byte(composeFileString)); err != nil {
170+
t.Fatal("Unexpected error writing to test file: ", err)
171+
}
172+
if err := tmpfile.Close(); err != nil {
173+
t.Fatal("Unexpected error closing test file: ", err)
174+
}
175+
176+
// setup project and parse
177+
project := setupTestProject(t)
178+
project.ecsContext.ComposeFiles = append(project.ecsContext.ComposeFiles, tmpfile.Name())
179+
foundVersion, _ := project.checkComposeVersion()
180+
181+
assert.Equal(t, testVersion, foundVersion, "Found compose version does not match expected.")
182+
}
183+
184+
func TestCheckComposeVersionWhenMissing(t *testing.T) {
185+
testVersion := ""
186+
composeFileString := `wordpress:
187+
image: wordpress
188+
ports: ["80:80"]
189+
mem_reservation: 500000000
190+
mysql:
191+
image: mysql`
192+
193+
// set up compose file
194+
tmpfile, err := ioutil.TempFile("", "test")
195+
if err != nil {
196+
t.Fatal("Unexpected error in creating test file: ", err)
197+
}
198+
defer os.Remove(tmpfile.Name())
199+
200+
if _, err := tmpfile.Write([]byte(composeFileString)); err != nil {
201+
t.Fatal("Unexpected error writing to test file: ", err)
202+
}
203+
if err := tmpfile.Close(); err != nil {
204+
t.Fatal("Unexpected error closing test file: ", err)
205+
}
206+
207+
// setup project and parse
208+
project := setupTestProject(t)
209+
project.ecsContext.ComposeFiles = append(project.ecsContext.ComposeFiles, tmpfile.Name())
210+
foundVersion, _ := project.checkComposeVersion()
211+
212+
assert.Equal(t, testVersion, foundVersion, "Found compose version does not match expected.")
213+
}
214+
215+
func TestThrowErrorWhenVersionInDifferentFormats(t *testing.T) {
216+
justMajorVersionFileString := `version: '2'
217+
services:
218+
wordpress:
219+
image: wordpress
220+
ports: ["80:80"]
221+
mem_reservation: 500000000
222+
mysql:
223+
image: mysql`
224+
225+
withMinorVersionFileString := `version: '2.0'
226+
services:
227+
redis:
228+
image: redis
229+
ports: ["90:90"]`
230+
231+
// initialize temp files
232+
tmpfile1, err1 := ioutil.TempFile("", "test")
233+
if err1 != nil {
234+
t.Fatal("Unexpected error in creating test file: ", err1)
106235
}
107236
defer os.Remove(tmpfile1.Name())
108237

109238
tmpfile2, err2 := ioutil.TempFile("", "test")
110239
if err2 != nil {
111-
t.Fatal("Unexpected error in creating test file", err2)
240+
t.Fatal("Unexpected error in creating test file: ", err2)
112241
}
113242
defer os.Remove(tmpfile2.Name())
114243

115-
// write compose contents to file
116-
tmpfile1.Write([]byte(version3FileString))
117-
tmpfile1.Close()
118-
tmpfile2.Write([]byte(version2FileString))
119-
tmpfile2.Close()
244+
// write compose contents to files
245+
if _, err := tmpfile1.Write([]byte(justMajorVersionFileString)); err != nil {
246+
t.Fatal("Unexpected error writing to test file: ", err)
247+
}
248+
if err := tmpfile1.Close(); err != nil {
249+
t.Fatal("Unexpected error closing test file: ", err)
250+
}
251+
252+
if _, err := tmpfile2.Write([]byte(withMinorVersionFileString)); err != nil {
253+
t.Fatal("Unexpected error writing to test file: ", err)
254+
}
255+
if err := tmpfile2.Close(); err != nil {
256+
t.Fatal("Unexpected error closing test file: ", err)
257+
}
120258

121259
// setup project and check that error is thrown for mismatches file versions
122260
project := setupTestProject(t)

0 commit comments

Comments
 (0)