/
copy.go
70 lines (57 loc) · 1.3 KB
/
copy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package copy
import (
"io"
"mime/multipart"
"net/http"
"net/url"
"os"
"github.com/kobsio/kobs/pkg/log"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/remotecommand"
)
// FileFromPod let a user download a file from a container.
func FileFromPod(w http.ResponseWriter, config *rest.Config, reqURL *url.URL) error {
reader, outStream := io.Pipe()
exec, err := remotecommand.NewSPDYExecutor(config, "POST", reqURL)
if err != nil {
return err
}
go func() {
defer outStream.Close()
err = exec.Stream(remotecommand.StreamOptions{
Stdin: os.Stdin,
Stdout: outStream,
Stderr: os.Stderr,
Tty: false,
})
if err != nil {
log.Error(nil, "Could not copy file from pod")
}
}()
if _, err := io.Copy(w, reader); err != nil {
return err
}
return nil
}
// FileToPod let a user upload a file to a container.
func FileToPod(config *rest.Config, reqURL *url.URL, srcFile multipart.File, destPath string) error {
reader, writer := io.Pipe()
go func() {
defer writer.Close()
io.Copy(writer, srcFile)
}()
exec, err := remotecommand.NewSPDYExecutor(config, "POST", reqURL)
if err != nil {
return err
}
err = exec.Stream(remotecommand.StreamOptions{
Stdin: reader,
Stdout: os.Stdout,
Stderr: os.Stderr,
Tty: false,
})
if err != nil {
return err
}
return nil
}