This change enables `fakeGIT()` to use the new `fakeStorage`
server which is automatically starting a container on the remote test
daemon machine using the git repo directory (when requested).
Fixes the following tests:
- `TestBuildApiLowerDockerfile`
- `TestBuildApiBuildGitWithF`
- `TestBuildApiDoubleDockerfile` (skipped on windows: NTFS case-insensitive)
- `TestBuildFromGIT` (still needs local server)
Signed-off-by: Ahmet Alp Balkan <ahmetalpbalkan@gmail.com>
... | ... |
@@ -382,7 +382,7 @@ func TestBuildApiLowerDockerfile(t *testing.T) { |
382 | 382 |
git, err := fakeGIT("repo", map[string]string{ |
383 | 383 |
"dockerfile": `FROM busybox |
384 | 384 |
RUN echo from dockerfile`, |
385 |
- }) |
|
385 |
+ }, false) |
|
386 | 386 |
if err != nil { |
387 | 387 |
t.Fatal(err) |
388 | 388 |
} |
... | ... |
@@ -407,7 +407,7 @@ func TestBuildApiBuildGitWithF(t *testing.T) { |
407 | 407 |
RUN echo from baz`, |
408 | 408 |
"Dockerfile": `FROM busybox |
409 | 409 |
RUN echo from Dockerfile`, |
410 |
- }) |
|
410 |
+ }, false) |
|
411 | 411 |
if err != nil { |
412 | 412 |
t.Fatal(err) |
413 | 413 |
} |
... | ... |
@@ -428,12 +428,13 @@ RUN echo from Dockerfile`, |
428 | 428 |
} |
429 | 429 |
|
430 | 430 |
func TestBuildApiDoubleDockerfile(t *testing.T) { |
431 |
+ testRequires(t, UnixCli) // dockerfile overwrites Dockerfile on Windows |
|
431 | 432 |
git, err := fakeGIT("repo", map[string]string{ |
432 | 433 |
"Dockerfile": `FROM busybox |
433 | 434 |
RUN echo from Dockerfile`, |
434 | 435 |
"dockerfile": `FROM busybox |
435 | 436 |
RUN echo from dockerfile`, |
436 |
- }) |
|
437 |
+ }, false) |
|
437 | 438 |
if err != nil { |
438 | 439 |
t.Fatal(err) |
439 | 440 |
} |
... | ... |
@@ -3940,7 +3940,7 @@ RUN cat /existing-directory-trailing-slash/test/foo | grep Hi` |
3940 | 3940 |
if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil { |
3941 | 3941 |
t.Fatalf("failed to open destination dockerfile: %v", err) |
3942 | 3942 |
} |
3943 |
- return &FakeContext{Dir: tmpDir} |
|
3943 |
+ return fakeContextFromDir(tmpDir) |
|
3944 | 3944 |
}() |
3945 | 3945 |
defer ctx.Close() |
3946 | 3946 |
|
... | ... |
@@ -3991,7 +3991,7 @@ func TestBuildAddTarXz(t *testing.T) { |
3991 | 3991 |
if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil { |
3992 | 3992 |
t.Fatalf("failed to open destination dockerfile: %v", err) |
3993 | 3993 |
} |
3994 |
- return &FakeContext{Dir: tmpDir} |
|
3994 |
+ return fakeContextFromDir(tmpDir) |
|
3995 | 3995 |
}() |
3996 | 3996 |
|
3997 | 3997 |
defer ctx.Close() |
... | ... |
@@ -4051,7 +4051,7 @@ func TestBuildAddTarXzGz(t *testing.T) { |
4051 | 4051 |
if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil { |
4052 | 4052 |
t.Fatalf("failed to open destination dockerfile: %v", err) |
4053 | 4053 |
} |
4054 |
- return &FakeContext{Dir: tmpDir} |
|
4054 |
+ return fakeContextFromDir(tmpDir) |
|
4055 | 4055 |
}() |
4056 | 4056 |
|
4057 | 4057 |
defer ctx.Close() |
... | ... |
@@ -4072,7 +4072,7 @@ func TestBuildFromGIT(t *testing.T) { |
4072 | 4072 |
RUN [ -f /first ] |
4073 | 4073 |
MAINTAINER docker`, |
4074 | 4074 |
"first": "test git data", |
4075 |
- }) |
|
4075 |
+ }, true) |
|
4076 | 4076 |
if err != nil { |
4077 | 4077 |
t.Fatal(err) |
4078 | 4078 |
} |
... | ... |
@@ -4563,7 +4563,7 @@ func TestBuildSymlinkBreakout(t *testing.T) { |
4563 | 4563 |
}) |
4564 | 4564 |
w.Close() |
4565 | 4565 |
f.Close() |
4566 |
- if _, err := buildImageFromContext(name, &FakeContext{Dir: ctx}, false); err != nil { |
|
4566 |
+ if _, err := buildImageFromContext(name, fakeContextFromDir(ctx), false); err != nil { |
|
4567 | 4567 |
t.Fatal(err) |
4568 | 4568 |
} |
4569 | 4569 |
if _, err := os.Lstat(filepath.Join(tmpdir, "inject")); err == nil { |
... | ... |
@@ -559,7 +559,11 @@ func (f *FakeContext) Close() error { |
559 | 559 |
return os.RemoveAll(f.Dir) |
560 | 560 |
} |
561 | 561 |
|
562 |
-func fakeContext(dockerfile string, files map[string]string) (*FakeContext, error) { |
|
562 |
+func fakeContextFromDir(dir string) *FakeContext { |
|
563 |
+ return &FakeContext{dir} |
|
564 |
+} |
|
565 |
+ |
|
566 |
+func fakeContextWithFiles(files map[string]string) (*FakeContext, error) { |
|
563 | 567 |
tmp, err := ioutil.TempDir("", "fake-context") |
564 | 568 |
if err != nil { |
565 | 569 |
return nil, err |
... | ... |
@@ -567,15 +571,32 @@ func fakeContext(dockerfile string, files map[string]string) (*FakeContext, erro |
567 | 567 |
if err := os.Chmod(tmp, 0755); err != nil { |
568 | 568 |
return nil, err |
569 | 569 |
} |
570 |
- ctx := &FakeContext{tmp} |
|
570 |
+ |
|
571 |
+ ctx := fakeContextFromDir(tmp) |
|
571 | 572 |
for file, content := range files { |
572 | 573 |
if err := ctx.Add(file, content); err != nil { |
573 | 574 |
ctx.Close() |
574 | 575 |
return nil, err |
575 | 576 |
} |
576 | 577 |
} |
578 |
+ return ctx, nil |
|
579 |
+} |
|
580 |
+ |
|
581 |
+func fakeContextAddDockerfile(ctx *FakeContext, dockerfile string) error { |
|
577 | 582 |
if err := ctx.Add("Dockerfile", dockerfile); err != nil { |
578 | 583 |
ctx.Close() |
584 |
+ return err |
|
585 |
+ } |
|
586 |
+ return nil |
|
587 |
+} |
|
588 |
+ |
|
589 |
+func fakeContext(dockerfile string, files map[string]string) (*FakeContext, error) { |
|
590 |
+ ctx, err := fakeContextWithFiles(files) |
|
591 |
+ if err != nil { |
|
592 |
+ ctx.Close() |
|
593 |
+ return nil, err |
|
594 |
+ } |
|
595 |
+ if err := fakeContextAddDockerfile(ctx, dockerfile); err != nil { |
|
579 | 596 |
return nil, err |
580 | 597 |
} |
581 | 598 |
return ctx, nil |
... | ... |
@@ -591,10 +612,19 @@ type FakeStorage interface { |
591 | 591 |
|
592 | 592 |
// fakeStorage returns either a local or remote (at daemon machine) file server |
593 | 593 |
func fakeStorage(files map[string]string) (FakeStorage, error) { |
594 |
+ ctx, err := fakeContextWithFiles(files) |
|
595 |
+ if err != nil { |
|
596 |
+ return nil, err |
|
597 |
+ } |
|
598 |
+ return fakeStorageWithContext(ctx) |
|
599 |
+} |
|
600 |
+ |
|
601 |
+// fakeStorageWithContext returns either a local or remote (at daemon machine) file server |
|
602 |
+func fakeStorageWithContext(ctx *FakeContext) (FakeStorage, error) { |
|
594 | 603 |
if isLocalDaemon { |
595 |
- return newLocalFakeStorage(files) |
|
604 |
+ return newLocalFakeStorage(ctx) |
|
596 | 605 |
} |
597 |
- return newRemoteFileServer(files) |
|
606 |
+ return newRemoteFileServer(ctx) |
|
598 | 607 |
} |
599 | 608 |
|
600 | 609 |
// localFileStorage is a file storage on the running machine |
... | ... |
@@ -616,18 +646,7 @@ func (s *localFileStorage) Close() error { |
616 | 616 |
return s.FakeContext.Close() |
617 | 617 |
} |
618 | 618 |
|
619 |
-func newLocalFakeStorage(files map[string]string) (*localFileStorage, error) { |
|
620 |
- tmp, err := ioutil.TempDir("", "fake-storage") |
|
621 |
- if err != nil { |
|
622 |
- return nil, err |
|
623 |
- } |
|
624 |
- ctx := &FakeContext{tmp} |
|
625 |
- for file, content := range files { |
|
626 |
- if err := ctx.Add(file, content); err != nil { |
|
627 |
- ctx.Close() |
|
628 |
- return nil, err |
|
629 |
- } |
|
630 |
- } |
|
619 |
+func newLocalFakeStorage(ctx *FakeContext) (*localFileStorage, error) { |
|
631 | 620 |
handler := http.FileServer(http.Dir(ctx.Dir)) |
632 | 621 |
server := httptest.NewServer(handler) |
633 | 622 |
return &localFileStorage{ |
... | ... |
@@ -671,15 +690,17 @@ func (f *remoteFileServer) Close() error { |
671 | 671 |
return deleteContainer(f.container) |
672 | 672 |
} |
673 | 673 |
|
674 |
-func newRemoteFileServer(files map[string]string) (*remoteFileServer, error) { |
|
674 |
+func newRemoteFileServer(ctx *FakeContext) (*remoteFileServer, error) { |
|
675 | 675 |
var ( |
676 | 676 |
image = fmt.Sprintf("fileserver-img-%s", strings.ToLower(makeRandomString(10))) |
677 | 677 |
container = fmt.Sprintf("fileserver-cnt-%s", strings.ToLower(makeRandomString(10))) |
678 | 678 |
) |
679 | 679 |
|
680 | 680 |
// Build the image |
681 |
- ctx, err := fakeContext(`FROM httpserver |
|
682 |
-COPY . /static`, files) |
|
681 |
+ if err := fakeContextAddDockerfile(ctx, `FROM httpserver |
|
682 |
+COPY . /static`); err != nil { |
|
683 |
+ return nil, fmt.Errorf("Cannot add Dockerfile to context: %v", err) |
|
684 |
+ } |
|
683 | 685 |
if _, err := buildImageFromContext(image, ctx, false); err != nil { |
684 | 686 |
return nil, fmt.Errorf("failed building file storage container image: %v", err) |
685 | 687 |
} |
... | ... |
@@ -831,29 +852,40 @@ func buildImageFromPath(name, path string, useCache bool) (string, error) { |
831 | 831 |
return getIDByName(name) |
832 | 832 |
} |
833 | 833 |
|
834 |
-type FakeGIT struct { |
|
834 |
+type GitServer interface { |
|
835 |
+ URL() string |
|
836 |
+ Close() error |
|
837 |
+} |
|
838 |
+ |
|
839 |
+type localGitServer struct { |
|
835 | 840 |
*httptest.Server |
836 |
- Root string |
|
841 |
+} |
|
842 |
+ |
|
843 |
+func (r *localGitServer) Close() error { |
|
844 |
+ r.Server.Close() |
|
845 |
+ return nil |
|
846 |
+} |
|
847 |
+ |
|
848 |
+func (r *localGitServer) URL() string { |
|
849 |
+ return r.Server.URL |
|
850 |
+} |
|
851 |
+ |
|
852 |
+type FakeGIT struct { |
|
853 |
+ root string |
|
854 |
+ server GitServer |
|
837 | 855 |
RepoURL string |
838 | 856 |
} |
839 | 857 |
|
840 | 858 |
func (g *FakeGIT) Close() { |
841 |
- g.Server.Close() |
|
842 |
- os.RemoveAll(g.Root) |
|
859 |
+ g.server.Close() |
|
860 |
+ os.RemoveAll(g.root) |
|
843 | 861 |
} |
844 | 862 |
|
845 |
-func fakeGIT(name string, files map[string]string) (*FakeGIT, error) { |
|
846 |
- tmp, err := ioutil.TempDir("", "fake-git-repo") |
|
863 |
+func fakeGIT(name string, files map[string]string, enforceLocalServer bool) (*FakeGIT, error) { |
|
864 |
+ ctx, err := fakeContextWithFiles(files) |
|
847 | 865 |
if err != nil { |
848 | 866 |
return nil, err |
849 | 867 |
} |
850 |
- ctx := &FakeContext{tmp} |
|
851 |
- for file, content := range files { |
|
852 |
- if err := ctx.Add(file, content); err != nil { |
|
853 |
- ctx.Close() |
|
854 |
- return nil, err |
|
855 |
- } |
|
856 |
- } |
|
857 | 868 |
defer ctx.Close() |
858 | 869 |
curdir, err := os.Getwd() |
859 | 870 |
if err != nil { |
... | ... |
@@ -904,12 +936,23 @@ func fakeGIT(name string, files map[string]string) (*FakeGIT, error) { |
904 | 904 |
os.RemoveAll(root) |
905 | 905 |
return nil, err |
906 | 906 |
} |
907 |
- handler := http.FileServer(http.Dir(root)) |
|
908 |
- server := httptest.NewServer(handler) |
|
907 |
+ |
|
908 |
+ var server GitServer |
|
909 |
+ if !enforceLocalServer { |
|
910 |
+ // use fakeStorage server, which might be local or remote (at test daemon) |
|
911 |
+ server, err = fakeStorageWithContext(fakeContextFromDir(root)) |
|
912 |
+ if err != nil { |
|
913 |
+ return nil, fmt.Errorf("cannot start fake storage: %v", err) |
|
914 |
+ } |
|
915 |
+ } else { |
|
916 |
+ // always start a local http server on CLI test machin |
|
917 |
+ httpServer := httptest.NewServer(http.FileServer(http.Dir(root))) |
|
918 |
+ server = &localGitServer{httpServer} |
|
919 |
+ } |
|
909 | 920 |
return &FakeGIT{ |
910 |
- Server: server, |
|
911 |
- Root: root, |
|
912 |
- RepoURL: fmt.Sprintf("%s/%s.git", server.URL, name), |
|
921 |
+ root: root, |
|
922 |
+ server: server, |
|
923 |
+ RepoURL: fmt.Sprintf("%s/%s.git", server.URL(), name), |
|
913 | 924 |
}, nil |
914 | 925 |
} |
915 | 926 |
|