Merge pull request #12342 from dmcgowan/fix-sandbox-client

Fixes for sandbox client
This commit is contained in:
Derek McGowan
2025-10-03 20:39:45 +00:00
committed by GitHub
5 changed files with 92 additions and 26 deletions

View File

@@ -117,7 +117,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 {
@@ -193,7 +197,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 {
@@ -218,10 +226,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
}
}
@@ -248,11 +257,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 != "" {
@@ -262,12 +271,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

@@ -114,7 +114,7 @@ func (s *sandboxClient) Stop(ctx context.Context) error {
}
func (s *sandboxClient) Shutdown(ctx context.Context) error {
if err := s.client.SandboxController(s.metadata.Sandboxer).Shutdown(ctx, s.ID()); err != nil && errdefs.IsNotFound(err) {
if err := s.client.SandboxController(s.metadata.Sandboxer).Shutdown(ctx, s.ID()); err != nil && !errdefs.IsNotFound(err) {
return fmt.Errorf("failed to shutdown sandbox: %w", err)
}
@@ -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 {
@@ -148,6 +153,10 @@ func (c *Client) NewSandbox(ctx context.Context, sandboxID string, opts ...NewSa
return nil, err
}
if err := c.SandboxController(sandboxer).Create(ctx, newSandbox); err != nil {
return nil, fmt.Errorf("failed to create sandbox with %s sandboxer: %w", sandboxer, err)
}
return &sandboxClient{
client: c,
metadata: metadata,