Skip to content

Commit 1cc1e89

Browse files
jschwinger233CMGS
authored andcommitted
runtime CopyFrom/CopyTo support uid, gid, mode
1 parent d1f0546 commit 1cc1e89

File tree

5 files changed

+58
-42
lines changed

5 files changed

+58
-42
lines changed

engine/docker/container.go

+12-8
Original file line numberDiff line numberDiff line change
@@ -320,13 +320,13 @@ func (e *Engine) VirtualizationResourceRemap(ctx context.Context, opts *enginety
320320
}
321321

322322
// VirtualizationCopyTo copy things to virtualization
323-
func (e *Engine) VirtualizationCopyTo(ctx context.Context, ID, target string, content io.Reader, AllowOverwriteDirWithFile, CopyUIDGID bool) error {
324-
return withTarfileDump(ctx, target, content, func(target, tarfile string) error {
323+
func (e *Engine) VirtualizationCopyTo(ctx context.Context, ID, target string, content []byte, uid, gid int, mode int64) error {
324+
return withTarfileDump(ctx, target, content, uid, gid, mode, func(target, tarfile string) error {
325325
content, err := os.Open(tarfile)
326326
if err != nil {
327327
return err
328328
}
329-
return e.client.CopyToContainer(ctx, ID, filepath.Dir(target), content, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: AllowOverwriteDirWithFile, CopyUIDGID: CopyUIDGID})
329+
return e.client.CopyToContainer(ctx, ID, filepath.Dir(target), content, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false})
330330
})
331331
}
332332

@@ -487,12 +487,16 @@ func (e *Engine) VirtualizationUpdateResource(ctx context.Context, ID string, op
487487
}
488488

489489
// VirtualizationCopyFrom copy thing from a virtualization
490-
func (e *Engine) VirtualizationCopyFrom(ctx context.Context, ID, path string) (io.ReadCloser, string, error) {
491-
resp, stat, err := e.client.CopyFromContainer(ctx, ID, path)
490+
func (e *Engine) VirtualizationCopyFrom(ctx context.Context, ID, path string) (content []byte, uid, gid int, mode int64, err error) {
491+
resp, _, err := e.client.CopyFromContainer(ctx, ID, path)
492492
if err != nil {
493-
return nil, "", err
493+
return
494494
}
495495
tarReader := tar.NewReader(resp)
496-
_, err = tarReader.Next()
497-
return ioutil.NopCloser(tarReader), stat.Name, errors.Wrapf(err, "read tarball from docker API failed: %s", path)
496+
header, err := tarReader.Next()
497+
if err != nil {
498+
return
499+
}
500+
content, err = ioutil.ReadAll(tarReader)
501+
return content, header.Uid, header.Gid, header.Mode, err
498502
}

engine/docker/tarfile.go

+6-9
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,15 @@ package docker
33
import (
44
"archive/tar"
55
"context"
6-
"io"
76
"io/ioutil"
87
"os"
98
"path/filepath"
109

1110
"github.com/projecteru2/core/log"
1211
)
1312

14-
func withTarfileDump(ctx context.Context, target string, content io.Reader, f func(target, tarfile string) error) error {
15-
bytes, err := ioutil.ReadAll(content)
16-
if err != nil {
17-
return err
18-
}
19-
tarfile, err := tempTarFile(target, bytes)
13+
func withTarfileDump(ctx context.Context, target string, content []byte, uid, gid int, mode int64, f func(target, tarfile string) error) error {
14+
tarfile, err := tempTarFile(target, content, uid, gid, mode)
2015

2116
defer func(tarfile string) {
2217
if err := os.RemoveAll(tarfile); err != nil {
@@ -30,7 +25,7 @@ func withTarfileDump(ctx context.Context, target string, content io.Reader, f fu
3025
return f(target, tarfile)
3126
}
3227

33-
func tempTarFile(path string, data []byte) (string, error) {
28+
func tempTarFile(path string, data []byte, uid, gid int, mode int64) (string, error) {
3429
filename := filepath.Base(path)
3530
f, err := ioutil.TempFile(os.TempDir(), filename)
3631
if err != nil {
@@ -43,8 +38,10 @@ func tempTarFile(path string, data []byte) (string, error) {
4338
defer tw.Close()
4439
hdr := &tar.Header{
4540
Name: filename,
46-
Mode: 0755,
4741
Size: int64(len(data)),
42+
Mode: int64(mode),
43+
Uid: int(uid),
44+
Gid: int(gid),
4845
}
4946
if err := tw.WriteHeader(hdr); err != nil {
5047
return name, err

engine/engine.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ type API interface {
3737

3838
VirtualizationCreate(ctx context.Context, opts *enginetypes.VirtualizationCreateOptions) (*enginetypes.VirtualizationCreated, error)
3939
VirtualizationResourceRemap(context.Context, *enginetypes.VirtualizationRemapOptions) (<-chan enginetypes.VirtualizationRemapMessage, error)
40-
VirtualizationCopyTo(ctx context.Context, ID, target string, content io.Reader, AllowOverwriteDirWithFile, CopyUIDGID bool) error
40+
VirtualizationCopyTo(ctx context.Context, ID, target string, content []byte, uid, gid int, mode int64) error
4141
VirtualizationStart(ctx context.Context, ID string) error
4242
VirtualizationStop(ctx context.Context, ID string, gracefulTimeout time.Duration) error
4343
VirtualizationRemove(ctx context.Context, ID string, volumes, force bool) error
@@ -47,7 +47,7 @@ type API interface {
4747
VirtualizationResize(ctx context.Context, ID string, height, width uint) error
4848
VirtualizationWait(ctx context.Context, ID, state string) (*enginetypes.VirtualizationWaitResult, error)
4949
VirtualizationUpdateResource(ctx context.Context, ID string, opts *enginetypes.VirtualizationResource) error
50-
VirtualizationCopyFrom(ctx context.Context, ID, path string) (io.ReadCloser, string, error)
50+
VirtualizationCopyFrom(ctx context.Context, ID, path string) (content []byte, uid, gid int, mode int64, _ error)
5151

5252
ResourceValidate(ctx context.Context, cpu float64, cpumap map[string]int64, memory, storage int64) error
5353
}

engine/mocks/API.go

+31-17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

engine/virt/virt.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"fmt"
88
"io"
99
"io/ioutil"
10-
"path/filepath"
1110
"strings"
1211
"time"
1312

@@ -179,8 +178,8 @@ func (v *Virt) VirtualizationResourceRemap(ctx context.Context, opts *enginetype
179178
}
180179

181180
// VirtualizationCopyTo copies one.
182-
func (v *Virt) VirtualizationCopyTo(ctx context.Context, ID, dest string, content io.Reader, AllowOverwriteDirWithFile, CopyUIDGID bool) error {
183-
return v.client.CopyToGuest(ctx, ID, dest, content, AllowOverwriteDirWithFile, CopyUIDGID)
181+
func (v *Virt) VirtualizationCopyTo(ctx context.Context, ID, dest string, content []byte, uid, gid int, mode int64) error {
182+
return v.client.CopyToGuest(ctx, ID, dest, bytes.NewReader(content), true, true)
184183
}
185184

186185
// VirtualizationStart boots a guest.
@@ -261,12 +260,14 @@ func (v *Virt) VirtualizationUpdateResource(ctx context.Context, ID string, opts
261260
}
262261

263262
// VirtualizationCopyFrom copies file content from the container.
264-
func (v *Virt) VirtualizationCopyFrom(ctx context.Context, ID, path string) (io.ReadCloser, string, error) {
263+
func (v *Virt) VirtualizationCopyFrom(ctx context.Context, ID, path string) (content []byte, uid, gid int, mode int64, err error) {
264+
// TODO@zc: virt shall return the properties too
265265
rd, err := v.client.Cat(ctx, ID, path)
266266
if err != nil {
267-
return nil, "", err
267+
return
268268
}
269-
return ioutil.NopCloser(rd), filepath.Base(path), nil
269+
content, err = ioutil.ReadAll(rd)
270+
return
270271
}
271272

272273
// VirtualizationExecute executes commands in running virtual unit

0 commit comments

Comments
 (0)