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 |
|