From cdd33d3ff258a4dee1c618fb4fbe8a52d3642690 Mon Sep 17 00:00:00 2001 From: Maxim Lobanov Date: Thu, 6 Aug 2020 21:04:00 +0300 Subject: [PATCH 1/3] proceed with next files when copy directory --- provisioner/file/provisioner.go | 6 +- provisioner/file/provisioner_test.go | 119 +++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/provisioner/file/provisioner.go b/provisioner/file/provisioner.go index a75502e76..96819b9bc 100644 --- a/provisioner/file/provisioner.go +++ b/provisioner/file/provisioner.go @@ -177,7 +177,11 @@ func (p *Provisioner) ProvisionUpload(ui packer.Ui, comm packer.Communicator) er // If we're uploading a directory, short circuit and do that if info.IsDir() { - return comm.UploadDir(dst, src, nil) + if err = comm.UploadDir(dst, src, nil); err != nil { + ui.Error(fmt.Sprintf("Upload failed: %s", err)) + return err + } + continue } // We're uploading a file... diff --git a/provisioner/file/provisioner_test.go b/provisioner/file/provisioner_test.go index d27dfaaa7..5d8bb2bef 100644 --- a/provisioner/file/provisioner_test.go +++ b/provisioner/file/provisioner_test.go @@ -149,6 +149,125 @@ func TestProvisionerProvision_SendsFile(t *testing.T) { } } +func TestProvisionerProvision_SendsFileMultipleFiles(t *testing.T) { + var p Provisioner + tf1, err := ioutil.TempFile("", "packer") + if err != nil { + t.Fatalf("error tempfile: %s", err) + } + defer os.Remove(tf1.Name()) + + if _, err = tf1.Write([]byte("hello")); err != nil { + t.Fatalf("error writing tempfile: %s", err) + } + + tf2, err := ioutil.TempFile("", "packer") + if err != nil { + t.Fatalf("error tempfile: %s", err) + } + defer os.Remove(tf2.Name()) + + if _, err = tf2.Write([]byte("hello")); err != nil { + t.Fatalf("error writing tempfile: %s", err) + } + + config := map[string]interface{}{ + "sources": []string{tf1.Name(), tf2.Name()}, + "destination": "something", + } + + if err := p.Prepare(config); err != nil { + t.Fatalf("err: %s", err) + } + + b := bytes.NewBuffer(nil) + ui := &packer.BasicUi{ + Writer: b, + } + comm := &packer.MockCommunicator{} + err = p.Provision(context.Background(), ui, comm, make(map[string]interface{})) + if err != nil { + t.Fatalf("should successfully provision: %s", err) + } + + if !strings.Contains(b.String(), tf1.Name()) { + t.Fatalf("should print first source filename") + } + + if !strings.Contains(b.String(), tf2.Name()) { + t.Fatalf("should print second source filename") + } +} + +func TestProvisionerProvision_SendsFileMultipleDirs(t *testing.T) { + var p Provisioner + + // Prepare the first directory + td1, err := ioutil.TempDir("", "packerdir") + if err != nil { + t.Fatalf("error temp folder 1: %s", err) + } + defer os.Remove(td1) + + tf1, err := ioutil.TempFile(td1, "packer") + if err != nil { + t.Fatalf("error tempfile: %s", err) + } + + if _, err = tf1.Write([]byte("hello")); err != nil { + t.Fatalf("error writing tempfile: %s", err) + } + + // Prepare the second directory + td2, err := ioutil.TempDir("", "packerdir") + if err != nil { + t.Fatalf("error temp folder 1: %s", err) + } + defer os.Remove(td2) + + tf2, err := ioutil.TempFile(td2, "packer") + if err != nil { + t.Fatalf("error tempfile: %s", err) + } + + if _, err = tf2.Write([]byte("hello")); err != nil { + t.Fatalf("error writing tempfile: %s", err) + } + + if _, err = tf1.Write([]byte("hello")); err != nil { + t.Fatalf("error writing tempfile: %s", err) + } + + // Run Provision + + config := map[string]interface{}{ + "sources": []string{td1, td2}, + "destination": "something", + } + + if err := p.Prepare(config); err != nil { + t.Fatalf("err: %s", err) + } + + b := bytes.NewBuffer(nil) + ui := &packer.BasicUi{ + Writer: b, + } + comm := &packer.MockCommunicator{} + err = p.Provision(context.Background(), ui, comm, make(map[string]interface{})) + if err != nil { + t.Fatalf("should successfully provision: %s", err) + } + + if !strings.Contains(b.String(), td1) { + t.Fatalf("should print first directory") + } + + if !strings.Contains(b.String(), td2) { + t.Fatalf("should print second directory") + } +} + func TestProvisionDownloadMkdirAll(t *testing.T) { tests := []struct { path string From cf999e07db22d2cfa0070a0c4d060255a9aef01e Mon Sep 17 00:00:00 2001 From: Maxim Lobanov Date: Thu, 6 Aug 2020 21:14:53 +0300 Subject: [PATCH 2/3] fix formatting --- provisioner/file/provisioner_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/provisioner/file/provisioner_test.go b/provisioner/file/provisioner_test.go index 5d8bb2bef..7239c709c 100644 --- a/provisioner/file/provisioner_test.go +++ b/provisioner/file/provisioner_test.go @@ -172,7 +172,7 @@ func TestProvisionerProvision_SendsFileMultipleFiles(t *testing.T) { } config := map[string]interface{}{ - "sources": []string{tf1.Name(), tf2.Name()}, + "sources": []string{tf1.Name(), tf2.Name()}, "destination": "something", } @@ -241,7 +241,7 @@ func TestProvisionerProvision_SendsFileMultipleDirs(t *testing.T) { // Run Provision config := map[string]interface{}{ - "sources": []string{td1, td2}, + "sources": []string{td1, td2}, "destination": "something", } From dd2927f8717b6f9b6edf1f92db46a36baebbad8f Mon Sep 17 00:00:00 2001 From: Maxim Lobanov Date: Fri, 7 Aug 2020 09:38:30 +0300 Subject: [PATCH 3/3] fix bug with copying a few files in order --- provisioner/file/provisioner.go | 5 ++- provisioner/file/provisioner_test.go | 58 ++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/provisioner/file/provisioner.go b/provisioner/file/provisioner.go index 96819b9bc..f8fcc403a 100644 --- a/provisioner/file/provisioner.go +++ b/provisioner/file/provisioner.go @@ -196,15 +196,16 @@ func (p *Provisioner) ProvisionUpload(ui packer.Ui, comm packer.Communicator) er return err } + filedst := dst if strings.HasSuffix(dst, "/") { - dst = dst + filepath.Base(src) + filedst = dst + filepath.Base(src) } pf := ui.TrackProgress(filepath.Base(src), 0, info.Size(), f) defer pf.Close() // Upload the file - if err = comm.Upload(dst, pf, &fi); err != nil { + if err = comm.Upload(filedst, pf, &fi); err != nil { if strings.Contains(err.Error(), "Error restoring file") { ui.Error(fmt.Sprintf("Upload failed: %s; this can occur when "+ "your file destination is a folder without a trailing "+ diff --git a/provisioner/file/provisioner_test.go b/provisioner/file/provisioner_test.go index 7239c709c..0986e1e05 100644 --- a/provisioner/file/provisioner_test.go +++ b/provisioner/file/provisioner_test.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "os" "path/filepath" + "regexp" "strings" "testing" @@ -268,6 +269,63 @@ func TestProvisionerProvision_SendsFileMultipleDirs(t *testing.T) { } } +func TestProvisionerProvision_SendsFileMultipleFilesToFolder(t *testing.T) { + var p Provisioner + + tf1, err := ioutil.TempFile("", "packer") + if err != nil { + t.Fatalf("error tempfile: %s", err) + } + defer os.Remove(tf1.Name()) + + if _, err = tf1.Write([]byte("hello")); err != nil { + t.Fatalf("error writing tempfile: %s", err) + } + + tf2, err := ioutil.TempFile("", "packer") + if err != nil { + t.Fatalf("error tempfile: %s", err) + } + defer os.Remove(tf2.Name()) + + if _, err = tf2.Write([]byte("hello")); err != nil { + t.Fatalf("error writing tempfile: %s", err) + } + + config := map[string]interface{}{ + "sources": []string{tf1.Name(), tf2.Name()}, + "destination": "something/", + } + + if err := p.Prepare(config); err != nil { + t.Fatalf("err: %s", err) + } + + b := bytes.NewBuffer(nil) + ui := &packer.BasicUi{ + Writer: b, + } + comm := &packer.MockCommunicator{} + err = p.Provision(context.Background(), ui, comm, make(map[string]interface{})) + if err != nil { + t.Fatalf("should successfully provision: %s", err) + } + + if !strings.Contains(b.String(), tf1.Name()) { + t.Fatalf("should print first source filename") + } + + if !strings.Contains(b.String(), tf2.Name()) { + t.Fatalf("should print second source filename") + } + + dstRegex := regexp.MustCompile("something/\n") + allDst := dstRegex.FindAllString(b.String(), -1) + if len(allDst) != 2 { + t.Fatalf("some destinations are broken; output: \n%s", b.String()) + } +} + func TestProvisionDownloadMkdirAll(t *testing.T) { tests := []struct { path string