Add default sandboxer to client

Signed-off-by: Derek McGowan <derek@mcg.dev>
This commit is contained in:
Derek McGowan
2025-10-01 16:01:46 -07:00
parent ac811452f0
commit 54ba402a29
4 changed files with 72 additions and 21 deletions

View File

@@ -114,7 +114,11 @@ func New(address string, opts ...Opt) (*Client, error) {
}
if copts.defaultRuntime != "" {
c.runtime.value = copts.defaultRuntime
c.defaults.runtime = copts.defaultRuntime
}
if copts.defaultSandboxer != "" {
c.defaults.sandboxer = copts.defaultSandboxer
}
if copts.defaultPlatform != nil {
@@ -190,7 +194,11 @@ func NewWithConn(conn *grpc.ClientConn, opts ...Opt) (*Client, error) {
}
if copts.defaultRuntime != "" {
c.runtime.value = copts.defaultRuntime
c.defaults.runtime = copts.defaultRuntime
}
if copts.defaultSandboxer != "" {
c.defaults.sandboxer = copts.defaultSandboxer
}
if copts.defaultPlatform != nil {
@@ -215,10 +223,11 @@ type Client struct {
platform platforms.MatchComparer
connector func() (*grpc.ClientConn, error)
// this should only be accessed via defaultRuntime()
runtime struct {
value string
mut sync.Mutex
// this should only be accessed via default*() functions
defaults struct {
runtime string
sandboxer string
mut sync.Mutex
}
}
@@ -245,11 +254,11 @@ func (c *Client) Runtime() string {
}
func (c *Client) defaultRuntime(ctx context.Context) (string, error) {
c.runtime.mut.Lock()
defer c.runtime.mut.Unlock()
c.defaults.mut.Lock()
defer c.defaults.mut.Unlock()
if c.runtime.value != "" {
return c.runtime.value, nil
if c.defaults.runtime != "" {
return c.defaults.runtime, nil
}
if c.defaultns != "" {
@@ -259,12 +268,35 @@ func (c *Client) defaultRuntime(ctx context.Context) (string, error) {
return defaults.DefaultRuntime, fmt.Errorf("failed to get default runtime label: %w", err)
}
if label != "" {
c.runtime.value = label
c.defaults.runtime = label
return label, nil
}
}
c.runtime.value = defaults.DefaultRuntime
return c.runtime.value, nil
c.defaults.runtime = defaults.DefaultRuntime
return c.defaults.runtime, nil
}
func (c *Client) defaultSandboxer(ctx context.Context) (string, error) {
c.defaults.mut.Lock()
defer c.defaults.mut.Unlock()
if c.defaults.sandboxer != "" {
return c.defaults.sandboxer, nil
}
if c.defaultns != "" {
label, err := c.GetLabel(ctx, defaults.DefaultSandboxerNSLabel)
if err != nil {
// Don't set the sandboxer value if there's an error
return defaults.DefaultSandboxer, fmt.Errorf("failed to get default sandboxer label: %w", err)
}
if label != "" {
c.defaults.sandboxer = label
return label, nil
}
}
c.defaults.sandboxer = defaults.DefaultSandboxer
return c.defaults.sandboxer, nil
}
// IsServing returns true if the client can successfully connect to the

View File

@@ -30,14 +30,15 @@ import (
)
type clientOpts struct {
defaultns string
defaultRuntime string
defaultPlatform platforms.MatchComparer
services *services
dialOptions []grpc.DialOption
extraDialOpts []grpc.DialOption
callOptions []grpc.CallOption
timeout time.Duration
defaultns string
defaultRuntime string
defaultSandboxer string
defaultPlatform platforms.MatchComparer
services *services
dialOptions []grpc.DialOption
extraDialOpts []grpc.DialOption
callOptions []grpc.CallOption
timeout time.Duration
}
// Opt allows callers to set options on the containerd client
@@ -62,6 +63,14 @@ func WithDefaultRuntime(rt string) Opt {
}
}
// WithDefaultSandboxer sets the default sandboxer on the client
func WithDefaultSandboxer(sb string) Opt {
return func(c *clientOpts) error {
c.defaultSandboxer = sb
return nil
}
}
// WithDefaultPlatform sets the default platform matcher on the client
func WithDefaultPlatform(platform platforms.MatchComparer) Opt {
return func(c *clientOpts) error {

View File

@@ -131,10 +131,15 @@ func (c *Client) NewSandbox(ctx context.Context, sandboxID string, opts ...NewSa
return nil, errors.New("sandbox ID must be specified")
}
sandboxer, err := c.defaultSandboxer(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get default sandboxer: %w", err)
}
newSandbox := api.Sandbox{
ID: sandboxID,
CreatedAt: time.Now().UTC(),
UpdatedAt: time.Now().UTC(),
Sandboxer: sandboxer,
}
for _, opt := range opts {

View File

@@ -29,4 +29,9 @@ const (
// DefaultSnapshotterNSLabel defines the namespace label to check for the
// default snapshotter
DefaultSnapshotterNSLabel = "containerd.io/defaults/snapshotter"
// DefaultSandboxerNSLabel defines the namespace label to check for the
// default sandboxcr
DefaultSandboxerNSLabel = "containerd.io/defaults/sandboxer"
// DefaultSandboxer defines the default sandboxer to use for creating sandboxes.
DefaultSandboxer = "shim"
)