// +build !windows package libcontainerd import "fmt" // WithRemoteAddr sets the external containerd socket to connect to. func WithRemoteAddr(addr string) RemoteOption { return rpcAddr(addr) } type rpcAddr string func (a rpcAddr) Apply(r Remote) error { if remote, ok := r.(*remote); ok { remote.GRPC.Address = string(a) return nil } return fmt.Errorf("WithRemoteAddr option not supported for this remote") } // WithRemoteAddrUser sets the uid and gid to create the RPC address with func WithRemoteAddrUser(uid, gid int) RemoteOption { return rpcUser{uid, gid} } type rpcUser struct { uid int gid int } func (u rpcUser) Apply(r Remote) error { if remote, ok := r.(*remote); ok { remote.GRPC.Uid = u.uid remote.GRPC.Gid = u.gid return nil } return fmt.Errorf("WithRemoteAddr option not supported for this remote") } // WithStartDaemon defines if libcontainerd should also run containerd daemon. func WithStartDaemon(start bool) RemoteOption { return startDaemon(start) } type startDaemon bool func (s startDaemon) Apply(r Remote) error { if remote, ok := r.(*remote); ok { remote.startDaemon = bool(s) return nil } return fmt.Errorf("WithStartDaemon option not supported for this remote") } // WithLogLevel defines which log level to starts containerd with. // This only makes sense if WithStartDaemon() was set to true. func WithLogLevel(lvl string) RemoteOption { return logLevel(lvl) } type logLevel string func (l logLevel) Apply(r Remote) error { if remote, ok := r.(*remote); ok { remote.Debug.Level = string(l) return nil } return fmt.Errorf("WithDebugLog option not supported for this remote") } // WithDebugAddress defines at which location the debug GRPC connection // should be made func WithDebugAddress(addr string) RemoteOption { return debugAddress(addr) } type debugAddress string func (d debugAddress) Apply(r Remote) error { if remote, ok := r.(*remote); ok { remote.Debug.Address = string(d) return nil } return fmt.Errorf("WithDebugAddress option not supported for this remote") } // WithMetricsAddress defines at which location the debug GRPC connection // should be made func WithMetricsAddress(addr string) RemoteOption { return metricsAddress(addr) } type metricsAddress string func (m metricsAddress) Apply(r Remote) error { if remote, ok := r.(*remote); ok { remote.Metrics.Address = string(m) return nil } return fmt.Errorf("WithMetricsAddress option not supported for this remote") } // WithSnapshotter defines snapshotter driver should be used func WithSnapshotter(name string) RemoteOption { return snapshotter(name) } type snapshotter string func (s snapshotter) Apply(r Remote) error { if remote, ok := r.(*remote); ok { remote.snapshotter = string(s) return nil } return fmt.Errorf("WithSnapshotter option not supported for this remote") } // WithPlugin allow configuring a containerd plugin // configuration values passed needs to be quoted if quotes are needed in // the toml format. func WithPlugin(name string, conf interface{}) RemoteOption { return pluginConf{ name: name, conf: conf, } } type pluginConf struct { // Name is the name of the plugin name string conf interface{} } func (p pluginConf) Apply(r Remote) error { if remote, ok := r.(*remote); ok { remote.pluginConfs.Plugins[p.name] = p.conf return nil } return fmt.Errorf("WithPlugin option not supported for this remote") }