Unify file upload strategies

This commit is contained in:
Marcos Lilljedahl
2017-07-10 18:53:33 -03:00
parent e6b089f9be
commit b9f154c07c
5 changed files with 33 additions and 44 deletions

View File

@@ -4,6 +4,7 @@ import (
"io" "io"
"log" "log"
"net/http" "net/http"
"path/filepath"
"github.com/gorilla/mux" "github.com/gorilla/mux"
) )
@@ -20,7 +21,10 @@ func FileUpload(rw http.ResponseWriter, req *http.Request) {
// has a url query parameter, ignore body // has a url query parameter, ignore body
if url := req.URL.Query().Get("url"); url != "" { if url := req.URL.Query().Get("url"); url != "" {
err := core.InstanceUploadFromUrl(i, req.URL.Query().Get("url"))
_, fileName := filepath.Split(url)
err := core.InstanceUploadFromUrl(i, fileName, "", req.URL.Query().Get("url"))
if err != nil { if err != nil {
log.Println(err) log.Println(err)
rw.WriteHeader(http.StatusInternalServerError) rw.WriteHeader(http.StatusInternalServerError)
@@ -35,7 +39,7 @@ func FileUpload(rw http.ResponseWriter, req *http.Request) {
rw.WriteHeader(http.StatusBadRequest) rw.WriteHeader(http.StatusBadRequest)
return return
} }
r := req.URL.Query().Get("relative") path := req.URL.Query().Get("path")
for { for {
p, err := red.NextPart() p, err := red.NextPart()
@@ -50,21 +54,11 @@ func FileUpload(rw http.ResponseWriter, req *http.Request) {
if p.FileName() == "" { if p.FileName() == "" {
continue continue
} }
err = core.InstanceUploadFromReader(i, p.FileName(), path, p)
if r != "" { if err != nil {
err = core.InstanceUploadToCWDFromReader(i, p.FileName(), p) log.Println(err)
if err != nil { rw.WriteHeader(http.StatusInternalServerError)
log.Println(err) return
rw.WriteHeader(http.StatusInternalServerError)
return
}
} else {
err = core.InstanceUploadFromReader(i, p.FileName(), "/var/run/pwd/uploads", p)
if err != nil {
log.Println(err)
rw.WriteHeader(http.StatusInternalServerError)
return
}
} }
log.Printf("Uploaded [%s] to [%s]\n", p.FileName(), i.Name) log.Printf("Uploaded [%s] to [%s]\n", p.FileName(), i.Name)

View File

@@ -60,7 +60,7 @@ func (p *pwd) InstanceAttachTerminal(instance *types.Instance) error {
return nil return nil
} }
func (p *pwd) InstanceUploadFromUrl(instance *types.Instance, url string) error { func (p *pwd) InstanceUploadFromUrl(instance *types.Instance, fileName, dest string, url string) error {
defer observeAction("InstanceUploadFromUrl", time.Now()) defer observeAction("InstanceUploadFromUrl", time.Now())
log.Printf("Downloading file [%s]\n", url) log.Printf("Downloading file [%s]\n", url)
resp, err := http.Get(url) resp, err := http.Get(url)
@@ -72,9 +72,7 @@ func (p *pwd) InstanceUploadFromUrl(instance *types.Instance, url string) error
return fmt.Errorf("Could not download file [%s]. Status code: %d\n", url, resp.StatusCode) return fmt.Errorf("Could not download file [%s]. Status code: %d\n", url, resp.StatusCode)
} }
_, fileName := filepath.Split(url) copyErr := p.docker.CopyToContainer(instance.Name, dest, fileName, resp.Body)
copyErr := p.docker.CopyToContainer(instance.Name, "/var/run/pwd/uploads", fileName, resp.Body)
if copyErr != nil { if copyErr != nil {
return fmt.Errorf("Error while downloading file [%s]. Error: %s\n", url, copyErr) return fmt.Errorf("Error while downloading file [%s]. Error: %s\n", url, copyErr)
@@ -98,26 +96,21 @@ func (p *pwd) getInstanceCWD(instance *types.Instance) (string, error) {
return cwd, nil return cwd, nil
} }
func (p *pwd) InstanceUploadToCWDFromReader(instance *types.Instance, fileName string, reader io.Reader) error {
defer observeAction("InstanceUploadToCWDFromReader", time.Now())
var cwd string
var err error
if cwd, err = p.getInstanceCWD(instance); err != nil {
return err
}
if err = p.InstanceUploadFromReader(instance, fileName, cwd, reader); err != nil {
return err
}
return nil
}
func (p *pwd) InstanceUploadFromReader(instance *types.Instance, fileName, dest string, reader io.Reader) error { func (p *pwd) InstanceUploadFromReader(instance *types.Instance, fileName, dest string, reader io.Reader) error {
defer observeAction("InstanceUploadFromReader", time.Now()) defer observeAction("InstanceUploadFromReader", time.Now())
copyErr := p.docker.CopyToContainer(instance.Name, dest, fileName, reader) var finalDest string
if filepath.IsAbs(dest) {
finalDest = dest
} else {
if cwd, err := p.getInstanceCWD(instance); err != nil {
return err
} else {
finalDest = fmt.Sprintf("%s/%s", cwd, dest)
}
}
copyErr := p.docker.CopyToContainer(instance.Name, finalDest, fileName, reader)
if copyErr != nil { if copyErr != nil {
return fmt.Errorf("Error while uploading file [%s]. Error: %s\n", fileName, copyErr) return fmt.Errorf("Error while uploading file [%s]. Error: %s\n", fileName, copyErr)

View File

@@ -60,9 +60,8 @@ type PWDApi interface {
InstanceNew(session *types.Session, conf InstanceConfig) (*types.Instance, error) InstanceNew(session *types.Session, conf InstanceConfig) (*types.Instance, error)
InstanceResizeTerminal(instance *types.Instance, cols, rows uint) error InstanceResizeTerminal(instance *types.Instance, cols, rows uint) error
InstanceAttachTerminal(instance *types.Instance) error InstanceAttachTerminal(instance *types.Instance) error
InstanceUploadFromUrl(instance *types.Instance, url string) error InstanceUploadFromUrl(instance *types.Instance, fileName, dest, url string) error
InstanceUploadFromReader(instance *types.Instance, filename, dest string, reader io.Reader) error InstanceUploadFromReader(instance *types.Instance, fileName, dest string, reader io.Reader) error
InstanceUploadToCWDFromReader(instance *types.Instance, fileName string, reader io.Reader) error
InstanceGet(session *types.Session, name string) *types.Instance InstanceGet(session *types.Session, name string) *types.Instance
InstanceFindByIP(ip string) *types.Instance InstanceFindByIP(ip string) *types.Instance
InstanceFindByAlias(sessionPrefix, alias string) *types.Instance InstanceFindByAlias(sessionPrefix, alias string) *types.Instance

View File

@@ -5,6 +5,7 @@ import (
"log" "log"
"math" "math"
"path" "path"
"path/filepath"
"strings" "strings"
"sync" "sync"
"time" "time"
@@ -152,13 +153,15 @@ func (p *pwd) SessionDeployStack(s *types.Session) error {
log.Printf("Error creating instance for stack [%s]: %s\n", s.Stack, err) log.Printf("Error creating instance for stack [%s]: %s\n", s.Stack, err)
return err return err
} }
err = p.InstanceUploadFromUrl(i, s.Stack)
_, fileName := filepath.Split(s.Stack)
err = p.InstanceUploadFromUrl(i, fileName, "", s.Stack)
if err != nil { if err != nil {
log.Printf("Error uploading stack file [%s]: %s\n", s.Stack, err) log.Printf("Error uploading stack file [%s]: %s\n", s.Stack, err)
return err return err
} }
fileName := path.Base(s.Stack) fileName = path.Base(s.Stack)
file := fmt.Sprintf("/var/run/pwd/uploads/%s", fileName) file := fmt.Sprintf("/var/run/pwd/uploads/%s", fileName)
cmd := fmt.Sprintf("docker swarm init --advertise-addr eth0 && docker-compose -f %s pull && docker stack deploy -c %s %s", file, file, s.StackName) cmd := fmt.Sprintf("docker swarm init --advertise-addr eth0 && docker-compose -f %s pull && docker stack deploy -c %s %s", file, file, s.StackName)

View File

@@ -35,7 +35,7 @@
$scope.uploadFiles = function (files) { $scope.uploadFiles = function (files) {
if (files && files.length) { if (files && files.length) {
for (var i = 0; i < files.length; i++) { for (var i = 0; i < files.length; i++) {
Upload.upload({url: '/sessions/' + $scope.sessionId + '/instances/' + $scope.selectedInstance.name + '/uploads?relative=true', data: {file: files[i]}, method: 'POST'}); Upload.upload({url: '/sessions/' + $scope.sessionId + '/instances/' + $scope.selectedInstance.name + '/uploads', data: {file: files[i]}, method: 'POST'});
} }
} }
} }