k3s/pkg/rootless/portdriver.go

100 lines
2.2 KiB
Go

//go:build !windows
// +build !windows
package rootless
import (
"io"
"path"
"strings"
"github.com/rootless-containers/rootlesskit/pkg/port"
portbuiltin "github.com/rootless-containers/rootlesskit/pkg/port/builtin"
portslirp4netns "github.com/rootless-containers/rootlesskit/pkg/port/slirp4netns"
"github.com/sirupsen/logrus"
)
type logrusDebugWriter struct {
}
func (w *logrusDebugWriter) Write(p []byte) (int, error) {
s := strings.TrimSuffix(string(p), "\n")
logrus.Debug(s)
return len(p), nil
}
type portDriver interface {
NewParentDriver() (port.ParentDriver, error)
NewChildDriver() port.ChildDriver
LogWriter() io.Writer
SetStateDir(string)
APISocketPath() string
}
type builtinDriver struct {
logWriter io.Writer
stateDir string
}
func (b *builtinDriver) NewParentDriver() (port.ParentDriver, error) {
return portbuiltin.NewParentDriver(b.logWriter, b.stateDir)
}
func (b *builtinDriver) NewChildDriver() port.ChildDriver {
return portbuiltin.NewChildDriver(b.logWriter)
}
func (b *builtinDriver) LogWriter() io.Writer {
return b.logWriter
}
func (b *builtinDriver) SetStateDir(stateDir string) {
b.stateDir = stateDir
}
func (b *builtinDriver) APISocketPath() string {
return ""
}
type slirp4netnsDriver struct {
logWriter io.Writer
stateDir string
}
func (s *slirp4netnsDriver) NewParentDriver() (port.ParentDriver, error) {
return portslirp4netns.NewParentDriver(s.logWriter, s.APISocketPath())
}
func (s *slirp4netnsDriver) NewChildDriver() port.ChildDriver {
return portslirp4netns.NewChildDriver()
}
func (s *slirp4netnsDriver) LogWriter() io.Writer {
return s.logWriter
}
func (s *slirp4netnsDriver) SetStateDir(stateDir string) {
s.stateDir = stateDir
}
func (s *slirp4netnsDriver) APISocketPath() string {
if s.stateDir != "" {
return path.Join(s.stateDir, ".s4nn.sock")
}
return ""
}
func getDriver(driverName string) portDriver {
logWriter := &logrusDebugWriter{}
if driverName == "slirp4netns" {
return &slirp4netnsDriver{logWriter: logWriter}
}
if driverName != "" && driverName != "builtin" {
logrus.Warnf("Unsupported port driver %s, using default builtin", driverName)
}
return &builtinDriver{logWriter: logWriter}
}