From 97599ecb3df4159c3cb7949bd232ddb0613f1689 Mon Sep 17 00:00:00 2001 From: Sid Verma Date: Fri, 20 Apr 2018 15:00:45 +0530 Subject: [PATCH] Add ability to upload executable files (#55) * Add ability to upload executable files --- docker/resource_docker_container.go | 6 ++++++ docker/resource_docker_container_funcs.go | 10 +++++++++- docker/resource_docker_container_test.go | 10 +++++++++- website/docs/r/container.html.markdown | 3 +++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/docker/resource_docker_container.go b/docker/resource_docker_container.go index 4f666033..0603d76c 100644 --- a/docker/resource_docker_container.go +++ b/docker/resource_docker_container.go @@ -405,6 +405,12 @@ func resourceDockerContainer() *schema.Resource { Required: true, ForceNew: true, }, + "executable": &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + ForceNew: true, + Default: false, + }, }, }, }, diff --git a/docker/resource_docker_container_funcs.go b/docker/resource_docker_container_funcs.go index df240507..4480b0f0 100644 --- a/docker/resource_docker_container_funcs.go +++ b/docker/resource_docker_container_funcs.go @@ -210,15 +210,23 @@ func resourceDockerContainerCreate(d *schema.ResourceData, meta interface{}) err } if v, ok := d.GetOk("upload"); ok { + + var mode int64 for _, upload := range v.(*schema.Set).List() { content := upload.(map[string]interface{})["content"].(string) file := upload.(map[string]interface{})["file"].(string) + executable := upload.(map[string]interface{})["executable"].(bool) buf := new(bytes.Buffer) tw := tar.NewWriter(buf) + if executable { + mode = 0744 + } else { + mode = 0644 + } hdr := &tar.Header{ Name: file, - Mode: 0644, + Mode: mode, Size: int64(len(content)), } if err := tw.WriteHeader(hdr); err != nil { diff --git a/docker/resource_docker_container_test.go b/docker/resource_docker_container_test.go index 35dc6851..48e31c44 100644 --- a/docker/resource_docker_container_test.go +++ b/docker/resource_docker_container_test.go @@ -5,6 +5,8 @@ import ( "bytes" "fmt" "os" + "strconv" + "strings" "testing" dc "github.com/fsouza/go-dockerclient" @@ -245,8 +247,13 @@ func TestAccDockerContainer_upload(t *testing.T) { r := bytes.NewReader(buf.Bytes()) tr := tar.NewReader(r) - if _, err := tr.Next(); err != nil { + if header, err := tr.Next(); err != nil { return fmt.Errorf("Unable to read content of tar archive: %s", err) + } else { + mode := strconv.FormatInt(header.Mode, 8) + if !strings.HasSuffix(mode, "744") { + return fmt.Errorf("File permissions are incorrect: %s", mode) + } } fbuf := new(bytes.Buffer) @@ -479,6 +486,7 @@ resource "docker_container" "foo" { upload { content = "foo" file = "/terraform/test.txt" + executable = true } } ` diff --git a/website/docs/r/container.html.markdown b/website/docs/r/container.html.markdown index 99913b34..b3290f7c 100644 --- a/website/docs/r/container.html.markdown +++ b/website/docs/r/container.html.markdown @@ -161,6 +161,9 @@ Each `upload` supports the following * `content` - (Required, string) A content of a file to upload. * `file` - (Required, string) path to a file in the container. +* `executable` - (Optional, bool) If true, the file will be uploaded with user + executable permission. + Defaults to false. ### Devices