mirror of
https://github.com/containerd/containerd.git
synced 2026-06-30 19:58:29 +00:00
Merge pull request #12342 from dmcgowan/fix-sandbox-client
Fixes for sandbox client
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user