Use snapshot.Mountable as an argument type to readUser

Signed-off-by: Gabriel Adrian Samfira <gsamfira@cloudbasesolutions.com>
This commit is contained in:
Gabriel Adrian Samfira
2023-10-05 19:46:46 +03:00
parent fe3ca93c09
commit 2f3bda8ecb
5 changed files with 64 additions and 59 deletions

View File

@@ -212,19 +212,22 @@ func docopy(ctx context.Context, src, dest string, action pb.FileActionCopy, u *
// NewFileOpBackend returns a new file operation backend. The executor is currently only used for Windows,
// and it is used to construct the readUserFn field set in the returned Backend.
func NewFileOpBackend(readUserFn ReadUserCallback) *Backend {
return &Backend{
readUserFn: readUserFn,
func NewFileOpBackend(readUser ReadUserCallback) (*backend, error) {
if readUser == nil {
return nil, errors.New("readUser callback must be provided")
}
return &backend{
readUser: readUser,
}, nil
}
type ReadUserCallback func(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount) (*copy.User, error)
type ReadUserCallback func(chopt *pb.ChownOpt, mu, mg snapshot.Mountable) (*copy.User, error)
type Backend struct {
readUserFn ReadUserCallback
type backend struct {
readUser ReadUserCallback
}
func (fb *Backend) Mkdir(ctx context.Context, m, user, group fileoptypes.Mount, action pb.FileActionMkDir) error {
func (fb *backend) Mkdir(ctx context.Context, m, user, group fileoptypes.Mount, action pb.FileActionMkDir) error {
mnt, ok := m.(*Mount)
if !ok {
return errors.Errorf("invalid mount type %T", m)
@@ -237,8 +240,7 @@ func (fb *Backend) Mkdir(ctx context.Context, m, user, group fileoptypes.Mount,
}
defer lm.Unmount()
// u, err := readUser(action.Owner, user, group, fb.Executor)
u, err := fb.readUserFn(action.Owner, user, group)
u, err := fb.readUserWrapper(action.Owner, user, group)
if err != nil {
return err
}
@@ -246,7 +248,7 @@ func (fb *Backend) Mkdir(ctx context.Context, m, user, group fileoptypes.Mount,
return mkdir(ctx, dir, action, u, mnt.m.IdentityMapping())
}
func (fb *Backend) Mkfile(ctx context.Context, m, user, group fileoptypes.Mount, action pb.FileActionMkFile) error {
func (fb *backend) Mkfile(ctx context.Context, m, user, group fileoptypes.Mount, action pb.FileActionMkFile) error {
mnt, ok := m.(*Mount)
if !ok {
return errors.Errorf("invalid mount type %T", m)
@@ -259,7 +261,7 @@ func (fb *Backend) Mkfile(ctx context.Context, m, user, group fileoptypes.Mount,
}
defer lm.Unmount()
u, err := fb.readUserFn(action.Owner, user, group)
u, err := fb.readUserWrapper(action.Owner, user, group)
if err != nil {
return err
}
@@ -267,7 +269,7 @@ func (fb *Backend) Mkfile(ctx context.Context, m, user, group fileoptypes.Mount,
return mkfile(ctx, dir, action, u, mnt.m.IdentityMapping())
}
func (fb *Backend) Rm(ctx context.Context, m fileoptypes.Mount, action pb.FileActionRm) error {
func (fb *backend) Rm(ctx context.Context, m fileoptypes.Mount, action pb.FileActionRm) error {
mnt, ok := m.(*Mount)
if !ok {
return errors.Errorf("invalid mount type %T", m)
@@ -283,7 +285,7 @@ func (fb *Backend) Rm(ctx context.Context, m fileoptypes.Mount, action pb.FileAc
return rm(ctx, dir, action)
}
func (fb *Backend) Copy(ctx context.Context, m1, m2, user, group fileoptypes.Mount, action pb.FileActionCopy) error {
func (fb *backend) Copy(ctx context.Context, m1, m2, user, group fileoptypes.Mount, action pb.FileActionCopy) error {
mnt1, ok := m1.(*Mount)
if !ok {
return errors.Errorf("invalid mount type %T", m1)
@@ -307,7 +309,7 @@ func (fb *Backend) Copy(ctx context.Context, m1, m2, user, group fileoptypes.Mou
}
defer lm2.Unmount()
u, err := fb.readUserFn(action.Owner, user, group)
u, err := fb.readUserWrapper(action.Owner, user, group)
if err != nil {
return err
}
@@ -315,6 +317,33 @@ func (fb *Backend) Copy(ctx context.Context, m1, m2, user, group fileoptypes.Mou
return docopy(ctx, src, dest, action, u, mnt2.m.IdentityMapping())
}
func (fb *backend) readUserWrapper(owner *pb.ChownOpt, user, group fileoptypes.Mount) (*copy.User, error) {
var userMountable, groupMountable snapshot.Mountable
if user != nil {
usr, ok := user.(*Mount)
if !ok {
return nil, errors.Errorf("invalid mount type %T", user)
}
userMountable = usr.Mountable()
}
if group != nil {
grp, ok := group.(*Mount)
if !ok {
return nil, errors.Errorf("invalid mount type %T", group)
}
groupMountable = grp.Mountable()
}
// We don't check the mountables for nil here. Depending on the ChownOpt value,
// one of them may be nil. Allow the readUser function to handle this.
u, err := fb.readUser(owner, userMountable, groupMountable)
if err != nil {
return nil, err
}
return u, nil
}
func cleanPath(s string) (string, error) {
s, err := system.CheckSystemDriveAndRemoveDriveLetter(s, runtime.GOOS)
if err != nil {

View File

@@ -167,7 +167,10 @@ func (f *fileOp) Exec(ctx context.Context, g session.Group, inputs []solver.Resu
inpRefs = append(inpRefs, workerRef.ImmutableRef)
}
backend := file.NewFileOpBackend(getReadUserFn(f.w.Executor()))
backend, err := file.NewFileOpBackend(getReadUserFn(f.w))
if err != nil {
return nil, err
}
fs := NewFileOpSolver(f.w, backend, f.refManager)
outs, err := fs.Solve(ctx, inpRefs, f.op.Actions, g)

View File

@@ -5,21 +5,19 @@ import (
"syscall"
"github.com/containerd/continuity/fs"
"github.com/moby/buildkit/executor"
"github.com/moby/buildkit/snapshot"
"github.com/moby/buildkit/solver/llbsolver/file"
"github.com/moby/buildkit/solver/llbsolver/ops/fileoptypes"
"github.com/moby/buildkit/solver/pb"
"github.com/moby/buildkit/worker"
"github.com/opencontainers/runc/libcontainer/user"
"github.com/pkg/errors"
copy "github.com/tonistiigi/fsutil/copy"
)
func getReadUserFn(exec executor.Executor) func(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount) (*copy.User, error) {
func getReadUserFn(worker worker.Worker) func(chopt *pb.ChownOpt, mu, mg snapshot.Mountable) (*copy.User, error) {
return readUser
}
func readUser(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount) (*copy.User, error) {
func readUser(chopt *pb.ChownOpt, mu, mg snapshot.Mountable) (*copy.User, error) {
if chopt == nil {
return nil, nil
}
@@ -30,16 +28,8 @@ func readUser(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount) (*copy.User, error)
if mu == nil {
return nil, errors.Errorf("invalid missing user mount")
}
mmu, ok := mu.(*file.Mount)
if !ok {
return nil, errors.Errorf("invalid mount type %T", mu)
}
mountable := mmu.Mountable()
if mountable == nil {
return nil, errors.Errorf("invalid mountable")
}
lm := snapshot.LocalMounter(mountable)
lm := snapshot.LocalMounter(mu)
dir, err := lm.Mount()
if err != nil {
return nil, err
@@ -89,16 +79,8 @@ func readUser(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount) (*copy.User, error)
if mg == nil {
return nil, errors.Errorf("invalid missing group mount")
}
mmg, ok := mg.(*file.Mount)
if !ok {
return nil, errors.Errorf("invalid mount type %T", mg)
}
mountable := mmg.Mountable()
if mountable == nil {
return nil, errors.Errorf("invalid mountable")
}
lm := snapshot.LocalMounter(mountable)
lm := snapshot.LocalMounter(mg)
dir, err := lm.Mount()
if err != nil {
return nil, err

View File

@@ -4,18 +4,18 @@
package ops
import (
"github.com/moby/buildkit/executor"
"github.com/moby/buildkit/solver/llbsolver/ops/fileoptypes"
"github.com/moby/buildkit/snapshot"
"github.com/moby/buildkit/solver/pb"
"github.com/moby/buildkit/worker"
"github.com/pkg/errors"
copy "github.com/tonistiigi/fsutil/copy"
)
func getReadUserFn(exec executor.Executor) func(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount) (*copy.User, error) {
func getReadUserFn(worker worker.Worker) func(chopt *pb.ChownOpt, mu, mg snapshot.Mountable) (*copy.User, error) {
return readUser
}
func readUser(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount) (*copy.User, error) {
func readUser(chopt *pb.ChownOpt, mu, mg snapshot.Mountable) (*copy.User, error) {
if chopt == nil {
return nil, nil
}

View File

@@ -4,22 +4,21 @@ import (
"context"
"github.com/docker/docker/pkg/idtools"
"github.com/moby/buildkit/executor"
"github.com/moby/buildkit/solver/llbsolver/file"
"github.com/moby/buildkit/solver/llbsolver/ops/fileoptypes"
"github.com/moby/buildkit/snapshot"
"github.com/moby/buildkit/solver/pb"
"github.com/moby/buildkit/util/windows"
"github.com/moby/buildkit/worker"
"github.com/pkg/errors"
copy "github.com/tonistiigi/fsutil/copy"
)
func getReadUserFn(exec executor.Executor) func(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount) (*copy.User, error) {
return func(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount) (*copy.User, error) {
return readUser(chopt, mu, mg, exec)
func getReadUserFn(worker worker.Worker) func(chopt *pb.ChownOpt, mu, mg snapshot.Mountable) (*copy.User, error) {
return func(chopt *pb.ChownOpt, mu, mg snapshot.Mountable) (*copy.User, error) {
return readUser(chopt, mu, mg, worker)
}
}
func readUser(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount, exec executor.Executor) (*copy.User, error) {
func readUser(chopt *pb.ChownOpt, mu, mg snapshot.Mountable, worker worker.Worker) (*copy.User, error) {
if chopt == nil {
return nil, nil
}
@@ -30,21 +29,13 @@ func readUser(chopt *pb.ChownOpt, mu, mg fileoptypes.Mount, exec executor.Execut
if mu == nil {
return nil, errors.Errorf("invalid missing user mount")
}
mmu, ok := mu.(*file.Mount)
if !ok {
return nil, errors.Errorf("invalid mount type %T", mu)
}
mountable := mmu.Mountable()
if mountable == nil {
return nil, errors.Errorf("invalid mountable")
}
rootMounts, release, err := mountable.Mount()
rootMounts, release, err := mu.Mount()
if err != nil {
return nil, err
}
defer release()
ident, err := windows.ResolveUsernameToSID(context.Background(), exec, rootMounts, u.ByName.Name)
ident, err := windows.ResolveUsernameToSID(context.Background(), worker.Executor(), rootMounts, u.ByName.Name)
if err != nil {
return nil, err
}