Merge pull request #6706 from kzys/typeurl-upgrade
Use typeurl.Any instead of github.com/gogo/protobuf/types.Any
This commit is contained in:
		| @@ -38,13 +38,13 @@ import ( | |||||||
| 	"github.com/containerd/containerd/events" | 	"github.com/containerd/containerd/events" | ||||||
| 	"github.com/containerd/containerd/namespaces" | 	"github.com/containerd/containerd/namespaces" | ||||||
| 	"github.com/containerd/containerd/pkg/process" | 	"github.com/containerd/containerd/pkg/process" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	shimlog "github.com/containerd/containerd/runtime/v1" | 	shimlog "github.com/containerd/containerd/runtime/v1" | ||||||
| 	"github.com/containerd/containerd/runtime/v1/shim" | 	"github.com/containerd/containerd/runtime/v1/shim" | ||||||
| 	shimapi "github.com/containerd/containerd/runtime/v1/shim/v1" | 	shimapi "github.com/containerd/containerd/runtime/v1/shim/v1" | ||||||
| 	"github.com/containerd/containerd/sys/reaper" | 	"github.com/containerd/containerd/sys/reaper" | ||||||
| 	"github.com/containerd/containerd/version" | 	"github.com/containerd/containerd/version" | ||||||
| 	"github.com/containerd/ttrpc" | 	"github.com/containerd/ttrpc" | ||||||
| 	"github.com/containerd/typeurl" |  | ||||||
| 	ptypes "github.com/gogo/protobuf/types" | 	ptypes "github.com/gogo/protobuf/types" | ||||||
| 	"github.com/sirupsen/logrus" | 	"github.com/sirupsen/logrus" | ||||||
| 	exec "golang.org/x/sys/execabs" | 	exec "golang.org/x/sys/execabs" | ||||||
| @@ -301,7 +301,7 @@ type remoteEventsPublisher struct { | |||||||
|  |  | ||||||
| func (l *remoteEventsPublisher) Publish(ctx context.Context, topic string, event events.Event) error { | func (l *remoteEventsPublisher) Publish(ctx context.Context, topic string, event events.Event) error { | ||||||
| 	ns, _ := namespaces.Namespace(ctx) | 	ns, _ := namespaces.Namespace(ctx) | ||||||
| 	encoded, err := typeurl.MarshalAny(event) | 	encoded, err := protobuf.MarshalAnyToProto(event) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -280,7 +280,7 @@ var infoCommand = cli.Command{ | |||||||
| 			return nil | 			return nil | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if info.Spec != nil && info.Spec.Value != nil { | 		if info.Spec != nil && info.Spec.GetValue() != nil { | ||||||
| 			v, err := typeurl.UnmarshalAny(info.Spec) | 			v, err := typeurl.UnmarshalAny(info.Spec) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
|   | |||||||
| @@ -42,7 +42,7 @@ func RemoveCniNetworkIfExist(ctx context.Context, container containerd.Container | |||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	data, err := typeurl.UnmarshalAny(&networkMeta) | 	data, err := typeurl.UnmarshalAny(networkMeta) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("failed to unmarshal cni metadata extension  %s", commands.CtrCniMetadataExtension) | 		return fmt.Errorf("failed to unmarshal cni metadata extension  %s", commands.CtrCniMetadataExtension) | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								container.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								container.go
									
									
									
									
									
								
							| @@ -32,10 +32,10 @@ import ( | |||||||
| 	"github.com/containerd/containerd/errdefs" | 	"github.com/containerd/containerd/errdefs" | ||||||
| 	"github.com/containerd/containerd/images" | 	"github.com/containerd/containerd/images" | ||||||
| 	"github.com/containerd/containerd/oci" | 	"github.com/containerd/containerd/oci" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/runc/options" | 	"github.com/containerd/containerd/runtime/v2/runc/options" | ||||||
| 	"github.com/containerd/fifo" | 	"github.com/containerd/fifo" | ||||||
| 	"github.com/containerd/typeurl" | 	"github.com/containerd/typeurl" | ||||||
| 	prototypes "github.com/gogo/protobuf/types" |  | ||||||
| 	ver "github.com/opencontainers/image-spec/specs-go" | 	ver "github.com/opencontainers/image-spec/specs-go" | ||||||
| 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | 	ocispec "github.com/opencontainers/image-spec/specs-go/v1" | ||||||
| 	"github.com/opencontainers/selinux/go-selinux/label" | 	"github.com/opencontainers/selinux/go-selinux/label" | ||||||
| @@ -74,7 +74,7 @@ type Container interface { | |||||||
| 	// SetLabels sets the provided labels for the container and returns the final label set | 	// SetLabels sets the provided labels for the container and returns the final label set | ||||||
| 	SetLabels(context.Context, map[string]string) (map[string]string, error) | 	SetLabels(context.Context, map[string]string) (map[string]string, error) | ||||||
| 	// Extensions returns the extensions set on the container | 	// Extensions returns the extensions set on the container | ||||||
| 	Extensions(context.Context) (map[string]prototypes.Any, error) | 	Extensions(context.Context) (map[string]typeurl.Any, error) | ||||||
| 	// Update a container | 	// Update a container | ||||||
| 	Update(context.Context, ...UpdateContainerOpts) error | 	Update(context.Context, ...UpdateContainerOpts) error | ||||||
| 	// Checkpoint creates a checkpoint image of the current container | 	// Checkpoint creates a checkpoint image of the current container | ||||||
| @@ -120,7 +120,7 @@ func (c *container) Info(ctx context.Context, opts ...InfoOpts) (containers.Cont | |||||||
| 	return c.metadata, nil | 	return c.metadata, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *container) Extensions(ctx context.Context) (map[string]prototypes.Any, error) { | func (c *container) Extensions(ctx context.Context) (map[string]typeurl.Any, error) { | ||||||
| 	r, err := c.get(ctx) | 	r, err := c.get(ctx) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @@ -163,7 +163,7 @@ func (c *container) Spec(ctx context.Context) (*oci.Spec, error) { | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	var s oci.Spec | 	var s oci.Spec | ||||||
| 	if err := json.Unmarshal(r.Spec.Value, &s); err != nil { | 	if err := json.Unmarshal(r.Spec.GetValue(), &s); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return &s, nil | 	return &s, nil | ||||||
| @@ -284,7 +284,7 @@ func (c *container) NewTask(ctx context.Context, ioCreate cio.Creator, opts ...N | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
| 		request.Options = any | 		request.Options = protobuf.FromAny(any) | ||||||
| 	} | 	} | ||||||
| 	t := &task{ | 	t := &task{ | ||||||
| 		client: c.client, | 		client: c.client, | ||||||
|   | |||||||
| @@ -28,9 +28,9 @@ import ( | |||||||
| 	"github.com/containerd/containerd/diff" | 	"github.com/containerd/containerd/diff" | ||||||
| 	"github.com/containerd/containerd/images" | 	"github.com/containerd/containerd/images" | ||||||
| 	"github.com/containerd/containerd/platforms" | 	"github.com/containerd/containerd/platforms" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/rootfs" | 	"github.com/containerd/containerd/rootfs" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/runc/options" | 	"github.com/containerd/containerd/runtime/v2/runc/options" | ||||||
| 	"github.com/containerd/typeurl" |  | ||||||
| 	"github.com/opencontainers/go-digest" | 	"github.com/opencontainers/go-digest" | ||||||
| 	imagespec "github.com/opencontainers/image-spec/specs-go/v1" | 	imagespec "github.com/opencontainers/image-spec/specs-go/v1" | ||||||
| ) | ) | ||||||
| @@ -57,7 +57,7 @@ func WithCheckpointImage(ctx context.Context, client *Client, c *containers.Cont | |||||||
|  |  | ||||||
| // WithCheckpointTask includes the running task | // WithCheckpointTask includes the running task | ||||||
| func WithCheckpointTask(ctx context.Context, client *Client, c *containers.Container, index *imagespec.Index, copts *options.CheckpointOptions) error { | func WithCheckpointTask(ctx context.Context, client *Client, c *containers.Container, index *imagespec.Index, copts *options.CheckpointOptions) error { | ||||||
| 	any, err := typeurl.MarshalAny(copts) | 	any, err := protobuf.MarshalAnyToProto(copts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| @@ -98,8 +98,8 @@ func WithCheckpointTask(ctx context.Context, client *Client, c *containers.Conta | |||||||
|  |  | ||||||
| // WithCheckpointRuntime includes the container runtime info | // WithCheckpointRuntime includes the container runtime info | ||||||
| func WithCheckpointRuntime(ctx context.Context, client *Client, c *containers.Container, index *imagespec.Index, copts *options.CheckpointOptions) error { | func WithCheckpointRuntime(ctx context.Context, client *Client, c *containers.Container, index *imagespec.Index, copts *options.CheckpointOptions) error { | ||||||
| 	if c.Runtime.Options != nil { | 	if c.Runtime.Options != nil && c.Runtime.Options.GetValue() != nil { | ||||||
| 		data, err := c.Runtime.Options.Marshal() | 		data, err := protobuf.FromAny(c.Runtime.Options).Marshal() | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -27,9 +27,9 @@ import ( | |||||||
| 	"github.com/containerd/containerd/errdefs" | 	"github.com/containerd/containerd/errdefs" | ||||||
| 	"github.com/containerd/containerd/images" | 	"github.com/containerd/containerd/images" | ||||||
| 	"github.com/containerd/containerd/oci" | 	"github.com/containerd/containerd/oci" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/snapshots" | 	"github.com/containerd/containerd/snapshots" | ||||||
| 	"github.com/containerd/typeurl" | 	"github.com/containerd/typeurl" | ||||||
| 	"github.com/gogo/protobuf/types" |  | ||||||
| 	"github.com/opencontainers/image-spec/identity" | 	"github.com/opencontainers/image-spec/identity" | ||||||
| 	v1 "github.com/opencontainers/image-spec/specs-go/v1" | 	v1 "github.com/opencontainers/image-spec/specs-go/v1" | ||||||
| ) | ) | ||||||
| @@ -57,7 +57,7 @@ type InfoConfig struct { | |||||||
| func WithRuntime(name string, options interface{}) NewContainerOpts { | func WithRuntime(name string, options interface{}) NewContainerOpts { | ||||||
| 	return func(ctx context.Context, client *Client, c *containers.Container) error { | 	return func(ctx context.Context, client *Client, c *containers.Container) error { | ||||||
| 		var ( | 		var ( | ||||||
| 			any *types.Any | 			any typeurl.Any | ||||||
| 			err error | 			err error | ||||||
| 		) | 		) | ||||||
| 		if options != nil { | 		if options != nil { | ||||||
| @@ -288,9 +288,9 @@ func WithContainerExtension(name string, extension interface{}) NewContainerOpts | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if c.Extensions == nil { | 		if c.Extensions == nil { | ||||||
| 			c.Extensions = make(map[string]types.Any) | 			c.Extensions = make(map[string]typeurl.Any) | ||||||
| 		} | 		} | ||||||
| 		c.Extensions[name] = *any | 		c.Extensions[name] = any | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -315,7 +315,7 @@ func WithSpec(s *oci.Spec, opts ...oci.SpecOpts) NewContainerOpts { | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		var err error | 		var err error | ||||||
| 		c.Spec, err = typeurl.MarshalAny(s) | 		c.Spec, err = protobuf.MarshalAnyToProto(s) | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ import ( | |||||||
| 	"context" | 	"context" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/gogo/protobuf/types" | 	"github.com/containerd/typeurl" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Container represents the set of data pinned by a container. Unless otherwise | // Container represents the set of data pinned by a container. Unless otherwise | ||||||
| @@ -53,7 +53,7 @@ type Container struct { | |||||||
| 	// container. | 	// container. | ||||||
| 	// | 	// | ||||||
| 	// This field is required but mutable. | 	// This field is required but mutable. | ||||||
| 	Spec *types.Any | 	Spec typeurl.Any | ||||||
|  |  | ||||||
| 	// SnapshotKey specifies the snapshot key to use for the container's root | 	// SnapshotKey specifies the snapshot key to use for the container's root | ||||||
| 	// filesystem. When starting a task from this container, a caller should | 	// filesystem. When starting a task from this container, a caller should | ||||||
| @@ -75,13 +75,13 @@ type Container struct { | |||||||
| 	UpdatedAt time.Time | 	UpdatedAt time.Time | ||||||
|  |  | ||||||
| 	// Extensions stores client-specified metadata | 	// Extensions stores client-specified metadata | ||||||
| 	Extensions map[string]types.Any | 	Extensions map[string]typeurl.Any | ||||||
| } | } | ||||||
|  |  | ||||||
| // RuntimeInfo holds runtime specific information | // RuntimeInfo holds runtime specific information | ||||||
| type RuntimeInfo struct { | type RuntimeInfo struct { | ||||||
| 	Name    string | 	Name    string | ||||||
| 	Options *types.Any | 	Options typeurl.Any | ||||||
| } | } | ||||||
|  |  | ||||||
| // Store interacts with the underlying container storage | // Store interacts with the underlying container storage | ||||||
|   | |||||||
| @@ -24,6 +24,8 @@ import ( | |||||||
| 	containersapi "github.com/containerd/containerd/api/services/containers/v1" | 	containersapi "github.com/containerd/containerd/api/services/containers/v1" | ||||||
| 	"github.com/containerd/containerd/containers" | 	"github.com/containerd/containerd/containers" | ||||||
| 	"github.com/containerd/containerd/errdefs" | 	"github.com/containerd/containerd/errdefs" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
|  | 	"github.com/containerd/typeurl" | ||||||
| 	ptypes "github.com/gogo/protobuf/types" | 	ptypes "github.com/gogo/protobuf/types" | ||||||
| 	"google.golang.org/grpc/codes" | 	"google.golang.org/grpc/codes" | ||||||
| 	"google.golang.org/grpc/status" | 	"google.golang.org/grpc/status" | ||||||
| @@ -148,18 +150,22 @@ func (r *remoteContainers) Delete(ctx context.Context, id string) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func containerToProto(container *containers.Container) containersapi.Container { | func containerToProto(container *containers.Container) containersapi.Container { | ||||||
|  | 	extensions := make(map[string]ptypes.Any) | ||||||
|  | 	for k, v := range container.Extensions { | ||||||
|  | 		extensions[k] = *protobuf.FromAny(v) | ||||||
|  | 	} | ||||||
| 	return containersapi.Container{ | 	return containersapi.Container{ | ||||||
| 		ID:     container.ID, | 		ID:     container.ID, | ||||||
| 		Labels: container.Labels, | 		Labels: container.Labels, | ||||||
| 		Image:  container.Image, | 		Image:  container.Image, | ||||||
| 		Runtime: &containersapi.Container_Runtime{ | 		Runtime: &containersapi.Container_Runtime{ | ||||||
| 			Name:    container.Runtime.Name, | 			Name:    container.Runtime.Name, | ||||||
| 			Options: container.Runtime.Options, | 			Options: protobuf.FromAny(container.Runtime.Options), | ||||||
| 		}, | 		}, | ||||||
| 		Spec:        container.Spec, | 		Spec:        protobuf.FromAny(container.Spec), | ||||||
| 		Snapshotter: container.Snapshotter, | 		Snapshotter: container.Snapshotter, | ||||||
| 		SnapshotKey: container.SnapshotKey, | 		SnapshotKey: container.SnapshotKey, | ||||||
| 		Extensions:  container.Extensions, | 		Extensions:  extensions, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -171,6 +177,11 @@ func containerFromProto(containerpb *containersapi.Container) containers.Contain | |||||||
| 			Options: containerpb.Runtime.Options, | 			Options: containerpb.Runtime.Options, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	extensions := make(map[string]typeurl.Any) | ||||||
|  | 	for k, v := range containerpb.Extensions { | ||||||
|  | 		v := v | ||||||
|  | 		extensions[k] = &v | ||||||
|  | 	} | ||||||
| 	return containers.Container{ | 	return containers.Container{ | ||||||
| 		ID:          containerpb.ID, | 		ID:          containerpb.ID, | ||||||
| 		Labels:      containerpb.Labels, | 		Labels:      containerpb.Labels, | ||||||
| @@ -181,7 +192,7 @@ func containerFromProto(containerpb *containersapi.Container) containers.Contain | |||||||
| 		SnapshotKey: containerpb.SnapshotKey, | 		SnapshotKey: containerpb.SnapshotKey, | ||||||
| 		CreatedAt:   containerpb.CreatedAt, | 		CreatedAt:   containerpb.CreatedAt, | ||||||
| 		UpdatedAt:   containerpb.UpdatedAt, | 		UpdatedAt:   containerpb.UpdatedAt, | ||||||
| 		Extensions:  containerpb.Extensions, | 		Extensions:  extensions, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,6 +22,7 @@ import ( | |||||||
| 	eventsapi "github.com/containerd/containerd/api/services/events/v1" | 	eventsapi "github.com/containerd/containerd/api/services/events/v1" | ||||||
| 	"github.com/containerd/containerd/errdefs" | 	"github.com/containerd/containerd/errdefs" | ||||||
| 	"github.com/containerd/containerd/events" | 	"github.com/containerd/containerd/events" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/typeurl" | 	"github.com/containerd/typeurl" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -51,7 +52,7 @@ func (e *eventRemote) Publish(ctx context.Context, topic string, event events.Ev | |||||||
| 	} | 	} | ||||||
| 	req := &eventsapi.PublishRequest{ | 	req := &eventsapi.PublishRequest{ | ||||||
| 		Topic: topic, | 		Topic: topic, | ||||||
| 		Event: any, | 		Event: protobuf.FromAny(any), | ||||||
| 	} | 	} | ||||||
| 	if _, err := e.client.Publish(ctx, req); err != nil { | 	if _, err := e.client.Publish(ctx, req); err != nil { | ||||||
| 		return errdefs.FromGRPC(err) | 		return errdefs.FromGRPC(err) | ||||||
| @@ -65,7 +66,7 @@ func (e *eventRemote) Forward(ctx context.Context, envelope *events.Envelope) er | |||||||
| 			Timestamp: envelope.Timestamp, | 			Timestamp: envelope.Timestamp, | ||||||
| 			Namespace: envelope.Namespace, | 			Namespace: envelope.Namespace, | ||||||
| 			Topic:     envelope.Topic, | 			Topic:     envelope.Topic, | ||||||
| 			Event:     envelope.Event, | 			Event:     protobuf.FromAny(envelope.Event), | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	if _, err := e.client.Forward(ctx, req); err != nil { | 	if _, err := e.client.Forward(ctx, req); err != nil { | ||||||
|   | |||||||
| @@ -21,7 +21,6 @@ import ( | |||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/containerd/typeurl" | 	"github.com/containerd/typeurl" | ||||||
| 	"github.com/gogo/protobuf/types" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Envelope provides the packaging for an event. | // Envelope provides the packaging for an event. | ||||||
| @@ -29,7 +28,7 @@ type Envelope struct { | |||||||
| 	Timestamp time.Time | 	Timestamp time.Time | ||||||
| 	Namespace string | 	Namespace string | ||||||
| 	Topic     string | 	Topic     string | ||||||
| 	Event     *types.Any | 	Event     typeurl.Any | ||||||
| } | } | ||||||
|  |  | ||||||
| // Field returns the value for the given fieldpath as a string, if defined. | // Field returns the value for the given fieldpath as a string, if defined. | ||||||
|   | |||||||
| @@ -30,7 +30,6 @@ import ( | |||||||
| 	"github.com/containerd/containerd/namespaces" | 	"github.com/containerd/containerd/namespaces" | ||||||
| 	"github.com/containerd/typeurl" | 	"github.com/containerd/typeurl" | ||||||
| 	goevents "github.com/docker/go-events" | 	goevents "github.com/docker/go-events" | ||||||
| 	"github.com/gogo/protobuf/types" |  | ||||||
| 	"github.com/sirupsen/logrus" | 	"github.com/sirupsen/logrus" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -63,7 +62,7 @@ func (e *Exchange) Forward(ctx context.Context, envelope *events.Envelope) (err | |||||||
| 		logger := log.G(ctx).WithFields(logrus.Fields{ | 		logger := log.G(ctx).WithFields(logrus.Fields{ | ||||||
| 			"topic": envelope.Topic, | 			"topic": envelope.Topic, | ||||||
| 			"ns":    envelope.Namespace, | 			"ns":    envelope.Namespace, | ||||||
| 			"type":  envelope.Event.TypeUrl, | 			"type":  envelope.Event.GetTypeUrl(), | ||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @@ -82,7 +81,6 @@ func (e *Exchange) Forward(ctx context.Context, envelope *events.Envelope) (err | |||||||
| func (e *Exchange) Publish(ctx context.Context, topic string, event events.Event) (err error) { | func (e *Exchange) Publish(ctx context.Context, topic string, event events.Event) (err error) { | ||||||
| 	var ( | 	var ( | ||||||
| 		namespace string | 		namespace string | ||||||
| 		encoded   *types.Any |  | ||||||
| 		envelope  events.Envelope | 		envelope  events.Envelope | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| @@ -94,7 +92,7 @@ func (e *Exchange) Publish(ctx context.Context, topic string, event events.Event | |||||||
| 		return fmt.Errorf("envelope topic %q: %w", topic, err) | 		return fmt.Errorf("envelope topic %q: %w", topic, err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	encoded, err = typeurl.MarshalAny(event) | 	encoded, err := typeurl.MarshalAny(event) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| @@ -108,7 +106,7 @@ func (e *Exchange) Publish(ctx context.Context, topic string, event events.Event | |||||||
| 		logger := log.G(ctx).WithFields(logrus.Fields{ | 		logger := log.G(ctx).WithFields(logrus.Fields{ | ||||||
| 			"topic": envelope.Topic, | 			"topic": envelope.Topic, | ||||||
| 			"ns":    envelope.Namespace, | 			"ns":    envelope.Namespace, | ||||||
| 			"type":  envelope.Event.TypeUrl, | 			"type":  envelope.Event.GetTypeUrl(), | ||||||
| 		}) | 		}) | ||||||
|  |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @@ -17,7 +17,7 @@ require ( | |||||||
| 	github.com/containerd/imgcrypt v1.1.4-0.20220322210345-7eff50ecc4f6 | 	github.com/containerd/imgcrypt v1.1.4-0.20220322210345-7eff50ecc4f6 | ||||||
| 	github.com/containerd/nri v0.1.0 | 	github.com/containerd/nri v0.1.0 | ||||||
| 	github.com/containerd/ttrpc v1.1.0 | 	github.com/containerd/ttrpc v1.1.0 | ||||||
| 	github.com/containerd/typeurl v1.0.2 | 	github.com/containerd/typeurl v1.0.3-0.20220324183432-6193a0e03259 | ||||||
| 	github.com/containerd/zfs v1.0.0 | 	github.com/containerd/zfs v1.0.0 | ||||||
| 	github.com/containernetworking/plugins v1.1.1 | 	github.com/containernetworking/plugins v1.1.1 | ||||||
| 	github.com/coreos/go-systemd/v22 v22.3.2 | 	github.com/coreos/go-systemd/v22 v22.3.2 | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								go.sum
									
									
									
									
									
								
							| @@ -253,8 +253,9 @@ github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Ev | |||||||
| github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= | github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= | ||||||
| github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= | github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= | ||||||
| github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= | github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= | ||||||
| github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= |  | ||||||
| github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= | github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= | ||||||
|  | github.com/containerd/typeurl v1.0.3-0.20220324183432-6193a0e03259 h1:bJv9qgjarrsdd4XIIczeRdYXON88Fgn3GdXVfnQjcSo= | ||||||
|  | github.com/containerd/typeurl v1.0.3-0.20220324183432-6193a0e03259/go.mod h1:HDkcKOXRnX6yKnXv3P0QrogFi0DoiauK/LpQi961f0A= | ||||||
| github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= | github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= | ||||||
| github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= | github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= | ||||||
| github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= | github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= | ||||||
|   | |||||||
| @@ -1440,11 +1440,11 @@ func TestContainerExtensions(t *testing.T) { | |||||||
| 		if len(cExts) != 1 { | 		if len(cExts) != 1 { | ||||||
| 			t.Errorf("expected 1 container extension") | 			t.Errorf("expected 1 container extension") | ||||||
| 		} | 		} | ||||||
| 		if cExts["hello"].TypeUrl != ext.TypeUrl { | 		if actual := cExts["hello"].GetTypeUrl(); actual != ext.TypeUrl { | ||||||
| 			t.Errorf("got unexpected type url for extension: %s", cExts["hello"].TypeUrl) | 			t.Errorf("got unexpected type url for extension: %s", actual) | ||||||
| 		} | 		} | ||||||
| 		if !bytes.Equal(cExts["hello"].Value, ext.Value) { | 		if actual := cExts["hello"].GetValue(); !bytes.Equal(actual, ext.Value) { | ||||||
| 			t.Errorf("expected extension value %q, got: %q", ext.Value, cExts["hello"].Value) | 			t.Errorf("expected extension value %q, got: %q", ext.Value, actual) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ require ( | |||||||
| 	github.com/containerd/containerd v1.5.10 | 	github.com/containerd/containerd v1.5.10 | ||||||
| 	github.com/containerd/go-runc v1.0.0 | 	github.com/containerd/go-runc v1.0.0 | ||||||
| 	github.com/containerd/ttrpc v1.1.0 | 	github.com/containerd/ttrpc v1.1.0 | ||||||
| 	github.com/containerd/typeurl v1.0.2 | 	github.com/containerd/typeurl v1.0.3-0.20220324183432-6193a0e03259 | ||||||
| 	github.com/gogo/protobuf v1.3.2 | 	github.com/gogo/protobuf v1.3.2 | ||||||
| 	github.com/opencontainers/go-digest v1.0.0 | 	github.com/opencontainers/go-digest v1.0.0 | ||||||
| 	github.com/opencontainers/image-spec v1.0.3-0.20220303224323-02efb9a75ee1 | 	github.com/opencontainers/image-spec v1.0.3-0.20220303224323-02efb9a75ee1 | ||||||
|   | |||||||
| @@ -152,8 +152,9 @@ github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8h | |||||||
| github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= | github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= | ||||||
| github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= | github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= | ||||||
| github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= | github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= | ||||||
| github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= |  | ||||||
| github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= | github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= | ||||||
|  | github.com/containerd/typeurl v1.0.3-0.20220324183432-6193a0e03259 h1:bJv9qgjarrsdd4XIIczeRdYXON88Fgn3GdXVfnQjcSo= | ||||||
|  | github.com/containerd/typeurl v1.0.3-0.20220324183432-6193a0e03259/go.mod h1:HDkcKOXRnX6yKnXv3P0QrogFi0DoiauK/LpQi961f0A= | ||||||
| github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= | github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= | ||||||
| github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= | github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= | ||||||
| github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= | github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= | ||||||
|   | |||||||
| @@ -20,6 +20,8 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
|  | 	"github.com/containerd/typeurl" | ||||||
| 	"github.com/gogo/protobuf/proto" | 	"github.com/gogo/protobuf/proto" | ||||||
| 	"github.com/gogo/protobuf/types" | 	"github.com/gogo/protobuf/types" | ||||||
| 	bolt "go.etcd.io/bbolt" | 	bolt "go.etcd.io/bbolt" | ||||||
| @@ -151,7 +153,7 @@ func WriteTimestamps(bkt *bolt.Bucket, created, updated time.Time) error { | |||||||
|  |  | ||||||
| // WriteExtensions will write a KV map to the given bucket, | // WriteExtensions will write a KV map to the given bucket, | ||||||
| // where `K` is a string key and `V` is a protobuf's Any type that represents a generic extension. | // where `K` is a string key and `V` is a protobuf's Any type that represents a generic extension. | ||||||
| func WriteExtensions(bkt *bolt.Bucket, extensions map[string]types.Any) error { | func WriteExtensions(bkt *bolt.Bucket, extensions map[string]typeurl.Any) error { | ||||||
| 	if len(extensions) == 0 { | 	if len(extensions) == 0 { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| @@ -162,8 +164,8 @@ func WriteExtensions(bkt *bolt.Bucket, extensions map[string]types.Any) error { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for name, ext := range extensions { | 	for name, ext := range extensions { | ||||||
| 		ext := ext | 		ext := protobuf.FromAny(ext) | ||||||
| 		p, err := proto.Marshal(&ext) | 		p, err := proto.Marshal(ext) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| @@ -177,9 +179,9 @@ func WriteExtensions(bkt *bolt.Bucket, extensions map[string]types.Any) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| // ReadExtensions will read back a map of extensions from the given bucket, previously written by WriteExtensions | // ReadExtensions will read back a map of extensions from the given bucket, previously written by WriteExtensions | ||||||
| func ReadExtensions(bkt *bolt.Bucket) (map[string]types.Any, error) { | func ReadExtensions(bkt *bolt.Bucket) (map[string]typeurl.Any, error) { | ||||||
| 	var ( | 	var ( | ||||||
| 		extensions = make(map[string]types.Any) | 		extensions = make(map[string]typeurl.Any) | ||||||
| 		ebkt       = bkt.Bucket(bucketKeyExtensions) | 		ebkt       = bkt.Bucket(bucketKeyExtensions) | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| @@ -193,7 +195,7 @@ func ReadExtensions(bkt *bolt.Bucket) (map[string]types.Any, error) { | |||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		extensions[string(k)] = t | 		extensions[string(k)] = &t | ||||||
| 		return nil | 		return nil | ||||||
| 	}); err != nil { | 	}); err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @@ -203,12 +205,13 @@ func ReadExtensions(bkt *bolt.Bucket) (map[string]types.Any, error) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // WriteAny write a protobuf's Any type to the bucket | // WriteAny write a protobuf's Any type to the bucket | ||||||
| func WriteAny(bkt *bolt.Bucket, name []byte, any *types.Any) error { | func WriteAny(bkt *bolt.Bucket, name []byte, any typeurl.Any) error { | ||||||
| 	if any == nil { | 	pbany := protobuf.FromAny(any) | ||||||
|  | 	if pbany == nil { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	data, err := proto.Marshal(any) | 	data, err := proto.Marshal(pbany) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/labels" | 	"github.com/containerd/containerd/labels" | ||||||
| 	"github.com/containerd/containerd/metadata/boltutil" | 	"github.com/containerd/containerd/metadata/boltutil" | ||||||
| 	"github.com/containerd/containerd/namespaces" | 	"github.com/containerd/containerd/namespaces" | ||||||
|  | 	"github.com/containerd/typeurl" | ||||||
| 	"github.com/gogo/protobuf/proto" | 	"github.com/gogo/protobuf/proto" | ||||||
| 	"github.com/gogo/protobuf/types" | 	"github.com/gogo/protobuf/types" | ||||||
| 	bolt "go.etcd.io/bbolt" | 	bolt "go.etcd.io/bbolt" | ||||||
| @@ -211,7 +212,7 @@ func (s *containerStore) Update(ctx context.Context, container containers.Contai | |||||||
|  |  | ||||||
| 			if strings.HasPrefix(path, "extensions.") { | 			if strings.HasPrefix(path, "extensions.") { | ||||||
| 				if updated.Extensions == nil { | 				if updated.Extensions == nil { | ||||||
| 					updated.Extensions = map[string]types.Any{} | 					updated.Extensions = map[string]typeurl.Any{} | ||||||
| 				} | 				} | ||||||
| 				key := strings.TrimPrefix(path, "extensions.") | 				key := strings.TrimPrefix(path, "extensions.") | ||||||
| 				updated.Extensions[key] = container.Extensions[key] | 				updated.Extensions[key] = container.Extensions[key] | ||||||
|   | |||||||
| @@ -30,10 +30,13 @@ import ( | |||||||
| 	"github.com/containerd/containerd/filters" | 	"github.com/containerd/containerd/filters" | ||||||
| 	"github.com/containerd/containerd/log/logtest" | 	"github.com/containerd/containerd/log/logtest" | ||||||
| 	"github.com/containerd/containerd/namespaces" | 	"github.com/containerd/containerd/namespaces" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/typeurl" | 	"github.com/containerd/typeurl" | ||||||
| 	"github.com/gogo/protobuf/types" | 	"github.com/gogo/protobuf/types" | ||||||
|  | 	"github.com/google/go-cmp/cmp" | ||||||
| 	specs "github.com/opencontainers/runtime-spec/specs-go" | 	specs "github.com/opencontainers/runtime-spec/specs-go" | ||||||
| 	bolt "go.etcd.io/bbolt" | 	bolt "go.etcd.io/bbolt" | ||||||
|  | 	"gotest.tools/v3/assert" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func init() { | func init() { | ||||||
| @@ -47,7 +50,7 @@ func TestContainersList(t *testing.T) { | |||||||
| 	store := NewContainerStore(NewDB(db, nil, nil)) | 	store := NewContainerStore(NewDB(db, nil, nil)) | ||||||
|  |  | ||||||
| 	spec := &specs.Spec{} | 	spec := &specs.Spec{} | ||||||
| 	encoded, err := typeurl.MarshalAny(spec) | 	encoded, err := protobuf.MarshalAnyToProto(spec) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatal(err) | 		t.Fatal(err) | ||||||
| 	} | 	} | ||||||
| @@ -179,13 +182,13 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 	store := NewContainerStore(NewDB(db, nil, nil)) | 	store := NewContainerStore(NewDB(db, nil, nil)) | ||||||
|  |  | ||||||
| 	spec := &specs.Spec{} | 	spec := &specs.Spec{} | ||||||
| 	encoded, err := typeurl.MarshalAny(spec) | 	encoded, err := protobuf.MarshalAnyToProto(spec) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatal(err) | 		t.Fatal(err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	spec.Annotations = map[string]string{"updated": "true"} | 	spec.Annotations = map[string]string{"updated": "true"} | ||||||
| 	encodedUpdated, err := typeurl.MarshalAny(spec) | 	encodedUpdated, err := protobuf.MarshalAnyToProto(spec) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Fatal(err) | 		t.Fatal(err) | ||||||
| 	} | 	} | ||||||
| @@ -467,8 +470,8 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Runtime: containers.RuntimeInfo{ | 				Runtime: containers.RuntimeInfo{ | ||||||
| 					Name: "testruntime", | 					Name: "testruntime", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("hello"), | 						Value:   []byte("hello"), | ||||||
| 					}, | 					}, | ||||||
| @@ -479,8 +482,8 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Runtime: containers.RuntimeInfo{ | 				Runtime: containers.RuntimeInfo{ | ||||||
| 					Name: "testruntime", | 					Name: "testruntime", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("world"), | 						Value:   []byte("world"), | ||||||
| 					}, | 					}, | ||||||
| @@ -491,8 +494,8 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Runtime: containers.RuntimeInfo{ | 				Runtime: containers.RuntimeInfo{ | ||||||
| 					Name: "testruntime", | 					Name: "testruntime", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("world"), | 						Value:   []byte("world"), | ||||||
| 					}, | 					}, | ||||||
| @@ -506,8 +509,8 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Runtime: containers.RuntimeInfo{ | 				Runtime: containers.RuntimeInfo{ | ||||||
| 					Name: "testruntime", | 					Name: "testruntime", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("hello"), | 						Value:   []byte("hello"), | ||||||
| 					}, | 					}, | ||||||
| @@ -518,8 +521,8 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Runtime: containers.RuntimeInfo{ | 				Runtime: containers.RuntimeInfo{ | ||||||
| 					Name: "testruntime", | 					Name: "testruntime", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("world"), | 						Value:   []byte("world"), | ||||||
| 					}, | 					}, | ||||||
| @@ -531,8 +534,8 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Runtime: containers.RuntimeInfo{ | 				Runtime: containers.RuntimeInfo{ | ||||||
| 					Name: "testruntime", | 					Name: "testruntime", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("hello"), | 						Value:   []byte("hello"), | ||||||
| 					}, | 					}, | ||||||
| @@ -546,8 +549,8 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Runtime: containers.RuntimeInfo{ | 				Runtime: containers.RuntimeInfo{ | ||||||
| 					Name: "testruntime", | 					Name: "testruntime", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("hello"), | 						Value:   []byte("hello"), | ||||||
| 					}, | 					}, | ||||||
| @@ -557,8 +560,8 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Labels: map[string]string{ | 				Labels: map[string]string{ | ||||||
| 					"foo": "one", | 					"foo": "one", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("world"), | 						Value:   []byte("world"), | ||||||
| 					}, | 					}, | ||||||
| @@ -570,8 +573,8 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Runtime: containers.RuntimeInfo{ | 				Runtime: containers.RuntimeInfo{ | ||||||
| 					Name: "testruntime", | 					Name: "testruntime", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("world"), | 						Value:   []byte("world"), | ||||||
| 					}, | 					}, | ||||||
| @@ -585,21 +588,21 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Runtime: containers.RuntimeInfo{ | 				Runtime: containers.RuntimeInfo{ | ||||||
| 					Name: "testruntime", | 					Name: "testruntime", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					// leaves hello in place. | 					// leaves hello in place. | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("hello"), | 						Value:   []byte("hello"), | ||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			input: containers.Container{ | 			input: containers.Container{ | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("universe"), // this will be ignored | 						Value:   []byte("universe"), // this will be ignored | ||||||
| 					}, | 					}, | ||||||
| 					"bar": { | 					"bar": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("foo"), // this will be added | 						Value:   []byte("foo"), // this will be added | ||||||
| 					}, | 					}, | ||||||
| @@ -611,12 +614,12 @@ func TestContainersCreateUpdateDelete(t *testing.T) { | |||||||
| 				Runtime: containers.RuntimeInfo{ | 				Runtime: containers.RuntimeInfo{ | ||||||
| 					Name: "testruntime", | 					Name: "testruntime", | ||||||
| 				}, | 				}, | ||||||
| 				Extensions: map[string]types.Any{ | 				Extensions: map[string]typeurl.Any{ | ||||||
| 					"hello": { | 					"hello": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("hello"), // remains as world | 						Value:   []byte("hello"), // remains as world | ||||||
| 					}, | 					}, | ||||||
| 					"bar": { | 					"bar": &types.Any{ | ||||||
| 						TypeUrl: "test.update.extensions", | 						TypeUrl: "test.update.extensions", | ||||||
| 						Value:   []byte("foo"), // this will be added | 						Value:   []byte("foo"), // this will be added | ||||||
| 					}, | 					}, | ||||||
| @@ -702,10 +705,26 @@ func checkContainerTimestamps(t *testing.T, c *containers.Container, now time.Ti | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func checkContainersEqual(t *testing.T, a, b *containers.Container, format string, args ...interface{}) { | // isNil returns true if the given parameter is nil or typed nil. | ||||||
| 	if !reflect.DeepEqual(a, b) { | func isNil(x interface{}) bool { | ||||||
| 		t.Fatalf("containers not equal \n\t%v != \n\t%v: "+format, append([]interface{}{a, b}, args...)...) | 	if x == nil { | ||||||
|  | 		return true | ||||||
| 	} | 	} | ||||||
|  | 	v := reflect.ValueOf(x) | ||||||
|  | 	return v.Kind() == reflect.Ptr && v.IsNil() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func checkContainersEqual(t *testing.T, a, b *containers.Container, format string, args ...interface{}) { | ||||||
|  | 	// Ignore the difference of nil and typed nil. | ||||||
|  | 	opt := cmp.FilterValues( | ||||||
|  | 		func(x, y interface{}) bool { | ||||||
|  | 			return isNil(x) && isNil(y) | ||||||
|  | 		}, | ||||||
|  | 		cmp.Comparer(func(_, _ interface{}) bool { | ||||||
|  | 			return true | ||||||
|  | 		}), | ||||||
|  | 	) | ||||||
|  | 	assert.DeepEqual(t, a, b, opt) | ||||||
| } | } | ||||||
|  |  | ||||||
| func testEnv(t *testing.T) (context.Context, *bolt.DB, func()) { | func testEnv(t *testing.T) (context.Context, *bolt.DB, func()) { | ||||||
|   | |||||||
| @@ -33,7 +33,6 @@ import ( | |||||||
| 	sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" | 	sandboxstore "github.com/containerd/containerd/pkg/cri/store/sandbox" | ||||||
| 	ctrdutil "github.com/containerd/containerd/pkg/cri/util" | 	ctrdutil "github.com/containerd/containerd/pkg/cri/util" | ||||||
| 	"github.com/containerd/typeurl" | 	"github.com/containerd/typeurl" | ||||||
| 	gogotypes "github.com/gogo/protobuf/types" |  | ||||||
| 	"github.com/sirupsen/logrus" | 	"github.com/sirupsen/logrus" | ||||||
| 	"k8s.io/utils/clock" | 	"k8s.io/utils/clock" | ||||||
| ) | ) | ||||||
| @@ -207,7 +206,7 @@ func (em *eventMonitor) startContainerExitMonitor(ctx context.Context, id string | |||||||
| 	return stopCh | 	return stopCh | ||||||
| } | } | ||||||
|  |  | ||||||
| func convertEvent(e *gogotypes.Any) (string, interface{}, error) { | func convertEvent(e typeurl.Any) (string, interface{}, error) { | ||||||
| 	id := "" | 	id := "" | ||||||
| 	evt, err := typeurl.UnmarshalAny(e) | 	evt, err := typeurl.UnmarshalAny(e) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|   | |||||||
| @@ -374,10 +374,11 @@ func getRuntimeOptionsType(t string) interface{} { | |||||||
|  |  | ||||||
| // getRuntimeOptions get runtime options from container metadata. | // getRuntimeOptions get runtime options from container metadata. | ||||||
| func getRuntimeOptions(c containers.Container) (interface{}, error) { | func getRuntimeOptions(c containers.Container) (interface{}, error) { | ||||||
| 	if c.Runtime.Options == nil { | 	from := c.Runtime.Options | ||||||
|  | 	if from == nil || from.GetValue() == nil { | ||||||
| 		return nil, nil | 		return nil, nil | ||||||
| 	} | 	} | ||||||
| 	opts, err := typeurl.UnmarshalAny(c.Runtime.Options) | 	opts, err := typeurl.UnmarshalAny(from) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
|  | 	"github.com/containerd/containerd/containers" | ||||||
| 	"github.com/containerd/containerd/errdefs" | 	"github.com/containerd/containerd/errdefs" | ||||||
| 	"github.com/containerd/containerd/oci" | 	"github.com/containerd/containerd/oci" | ||||||
| 	criconfig "github.com/containerd/containerd/pkg/cri/config" | 	criconfig "github.com/containerd/containerd/pkg/cri/config" | ||||||
| @@ -32,6 +33,8 @@ import ( | |||||||
| 	"github.com/containerd/containerd/reference/docker" | 	"github.com/containerd/containerd/reference/docker" | ||||||
| 	"github.com/containerd/containerd/runtime/linux/runctypes" | 	"github.com/containerd/containerd/runtime/linux/runctypes" | ||||||
| 	runcoptions "github.com/containerd/containerd/runtime/v2/runc/options" | 	runcoptions "github.com/containerd/containerd/runtime/v2/runc/options" | ||||||
|  | 	"github.com/containerd/typeurl" | ||||||
|  | 	"github.com/gogo/protobuf/types" | ||||||
|  |  | ||||||
| 	imagedigest "github.com/opencontainers/go-digest" | 	imagedigest "github.com/opencontainers/go-digest" | ||||||
| 	runtimespec "github.com/opencontainers/runtime-spec/specs-go" | 	runtimespec "github.com/opencontainers/runtime-spec/specs-go" | ||||||
| @@ -599,3 +602,13 @@ func TestValidateTargetContainer(t *testing.T) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestGetRuntimeOptions(t *testing.T) { | ||||||
|  | 	_, err := getRuntimeOptions(containers.Container{}) | ||||||
|  | 	require.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	var pbany *types.Any               // This is nil. | ||||||
|  | 	var typeurlAny typeurl.Any = pbany // This is typed nil. | ||||||
|  | 	_, err = getRuntimeOptions(containers.Container{Runtime: containers.RuntimeInfo{Options: typeurlAny}}) | ||||||
|  | 	require.NoError(t, err) | ||||||
|  | } | ||||||
|   | |||||||
| @@ -166,7 +166,7 @@ func (c *criService) loadContainer(ctx context.Context, cntr containerd.Containe | |||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return container, fmt.Errorf("metadata extension %q not found", containerMetadataExtension) | 		return container, fmt.Errorf("metadata extension %q not found", containerMetadataExtension) | ||||||
| 	} | 	} | ||||||
| 	data, err := typeurl.UnmarshalAny(&ext) | 	data, err := typeurl.UnmarshalAny(ext) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return container, fmt.Errorf("failed to unmarshal metadata extension %q: %w", ext, err) | 		return container, fmt.Errorf("failed to unmarshal metadata extension %q: %w", ext, err) | ||||||
| 	} | 	} | ||||||
| @@ -335,7 +335,7 @@ func (c *criService) loadSandbox(ctx context.Context, cntr containerd.Container) | |||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return sandbox, fmt.Errorf("metadata extension %q not found", sandboxMetadataExtension) | 		return sandbox, fmt.Errorf("metadata extension %q not found", sandboxMetadataExtension) | ||||||
| 	} | 	} | ||||||
| 	data, err := typeurl.UnmarshalAny(&ext) | 	data, err := typeurl.UnmarshalAny(ext) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return sandbox, fmt.Errorf("failed to unmarshal metadata extension %q: %w", ext, err) | 		return sandbox, fmt.Errorf("failed to unmarshal metadata extension %q: %w", ext, err) | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										47
									
								
								protobuf/any.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								protobuf/any.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | |||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  |  | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | package protobuf | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"github.com/containerd/typeurl" | ||||||
|  | 	"github.com/gogo/protobuf/types" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // FromAny converts typeurl.Any to github.com/gogo/protobuf/types.Any. | ||||||
|  | func FromAny(from typeurl.Any) *types.Any { | ||||||
|  | 	if from == nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if pbany, ok := from.(*types.Any); ok { | ||||||
|  | 		return pbany | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return &types.Any{ | ||||||
|  | 		TypeUrl: from.GetTypeUrl(), | ||||||
|  | 		Value:   from.GetValue(), | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // FromAny converts an arbitrary interface to github.com/gogo/protobuf/types.Any. | ||||||
|  | func MarshalAnyToProto(from interface{}) (*types.Any, error) { | ||||||
|  | 	any, err := typeurl.MarshalAny(from) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return FromAny(any), nil | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								protobuf/any_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								protobuf/any_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | /* | ||||||
|  |    Copyright The containerd Authors. | ||||||
|  |  | ||||||
|  |    Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |    you may not use this file except in compliance with the License. | ||||||
|  |    You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |        http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  |    Unless required by applicable law or agreed to in writing, software | ||||||
|  |    distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |    See the License for the specific language governing permissions and | ||||||
|  |    limitations under the License. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | package protobuf | ||||||
|  |  | ||||||
|  | import "testing" | ||||||
|  |  | ||||||
|  | func TestFromAny(t *testing.T) { | ||||||
|  | 	actual := FromAny(nil) | ||||||
|  | 	if actual != nil { | ||||||
|  | 		t.Fatalf("expected nil, got %v", actual) | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -21,7 +21,7 @@ import ( | |||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/containerd/containerd/mount" | 	"github.com/containerd/containerd/mount" | ||||||
| 	"github.com/gogo/protobuf/types" | 	"github.com/containerd/typeurl" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // IO holds process IO information | // IO holds process IO information | ||||||
| @@ -35,7 +35,7 @@ type IO struct { | |||||||
| // CreateOpts contains task creation data | // CreateOpts contains task creation data | ||||||
| type CreateOpts struct { | type CreateOpts struct { | ||||||
| 	// Spec is the OCI runtime spec | 	// Spec is the OCI runtime spec | ||||||
| 	Spec *types.Any | 	Spec typeurl.Any | ||||||
| 	// Rootfs mounts to perform to gain access to the container's filesystem | 	// Rootfs mounts to perform to gain access to the container's filesystem | ||||||
| 	Rootfs []mount.Mount | 	Rootfs []mount.Mount | ||||||
| 	// IO for the container's main process | 	// IO for the container's main process | ||||||
| @@ -43,9 +43,9 @@ type CreateOpts struct { | |||||||
| 	// Checkpoint digest to restore container state | 	// Checkpoint digest to restore container state | ||||||
| 	Checkpoint string | 	Checkpoint string | ||||||
| 	// RuntimeOptions for the runtime | 	// RuntimeOptions for the runtime | ||||||
| 	RuntimeOptions *types.Any | 	RuntimeOptions typeurl.Any | ||||||
| 	// TaskOptions received for the task | 	// TaskOptions received for the task | ||||||
| 	TaskOptions *types.Any | 	TaskOptions typeurl.Any | ||||||
| 	// Runtime name to use (e.g. `io.containerd.NAME.VERSION`). | 	// Runtime name to use (e.g. `io.containerd.NAME.VERSION`). | ||||||
| 	// As an alternative full abs path to binary may be specified instead. | 	// As an alternative full abs path to binary may be specified instead. | ||||||
| 	Runtime string | 	Runtime string | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/pkg/process" | 	"github.com/containerd/containerd/pkg/process" | ||||||
| 	"github.com/containerd/containerd/platforms" | 	"github.com/containerd/containerd/platforms" | ||||||
| 	"github.com/containerd/containerd/plugin" | 	"github.com/containerd/containerd/plugin" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/runtime" | 	"github.com/containerd/containerd/runtime" | ||||||
| 	"github.com/containerd/containerd/runtime/linux/runctypes" | 	"github.com/containerd/containerd/runtime/linux/runctypes" | ||||||
| 	v1 "github.com/containerd/containerd/runtime/v1" | 	v1 "github.com/containerd/containerd/runtime/v1" | ||||||
| @@ -178,7 +179,7 @@ func (r *Runtime) Create(ctx context.Context, id string, opts runtime.CreateOpts | |||||||
| 	bundle, err := newBundle(id, | 	bundle, err := newBundle(id, | ||||||
| 		filepath.Join(r.state, namespace), | 		filepath.Join(r.state, namespace), | ||||||
| 		filepath.Join(r.root, namespace), | 		filepath.Join(r.root, namespace), | ||||||
| 		opts.Spec.Value) | 		opts.Spec.GetValue()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -191,7 +192,7 @@ func (r *Runtime) Create(ctx context.Context, id string, opts runtime.CreateOpts | |||||||
| 	shimopt := ShimLocal(r.config, r.events) | 	shimopt := ShimLocal(r.config, r.events) | ||||||
| 	if !r.config.NoShim { | 	if !r.config.NoShim { | ||||||
| 		var cgroup string | 		var cgroup string | ||||||
| 		if opts.TaskOptions != nil { | 		if opts.TaskOptions != nil && opts.TaskOptions.GetValue() != nil { | ||||||
| 			v, err := typeurl.UnmarshalAny(opts.TaskOptions) | 			v, err := typeurl.UnmarshalAny(opts.TaskOptions) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return nil, err | 				return nil, err | ||||||
| @@ -244,7 +245,7 @@ func (r *Runtime) Create(ctx context.Context, id string, opts runtime.CreateOpts | |||||||
| 		Stderr:     opts.IO.Stderr, | 		Stderr:     opts.IO.Stderr, | ||||||
| 		Terminal:   opts.IO.Terminal, | 		Terminal:   opts.IO.Terminal, | ||||||
| 		Checkpoint: opts.Checkpoint, | 		Checkpoint: opts.Checkpoint, | ||||||
| 		Options:    opts.TaskOptions, | 		Options:    protobuf.FromAny(opts.TaskOptions), | ||||||
| 	} | 	} | ||||||
| 	for _, m := range opts.Rootfs { | 	for _, m := range opts.Rootfs { | ||||||
| 		sopts.Rootfs = append(sopts.Rootfs, &types.Mount{ | 		sopts.Rootfs = append(sopts.Rootfs, &types.Mount{ | ||||||
| @@ -537,7 +538,7 @@ func (r *Runtime) getRuncOptions(ctx context.Context, id string) (*runctypes.Run | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if container.Runtime.Options != nil { | 	if container.Runtime.Options != nil && container.Runtime.Options.GetValue() != nil { | ||||||
| 		v, err := typeurl.UnmarshalAny(container.Runtime.Options) | 		v, err := typeurl.UnmarshalAny(container.Runtime.Options) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
|   | |||||||
| @@ -31,11 +31,11 @@ import ( | |||||||
| 	"github.com/containerd/containerd/events/exchange" | 	"github.com/containerd/containerd/events/exchange" | ||||||
| 	"github.com/containerd/containerd/identifiers" | 	"github.com/containerd/containerd/identifiers" | ||||||
| 	"github.com/containerd/containerd/log" | 	"github.com/containerd/containerd/log" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/runtime" | 	"github.com/containerd/containerd/runtime" | ||||||
| 	"github.com/containerd/containerd/runtime/v1/shim/client" | 	"github.com/containerd/containerd/runtime/v1/shim/client" | ||||||
| 	"github.com/containerd/containerd/runtime/v1/shim/v1" | 	"github.com/containerd/containerd/runtime/v1/shim/v1" | ||||||
| 	"github.com/containerd/ttrpc" | 	"github.com/containerd/ttrpc" | ||||||
| 	"github.com/containerd/typeurl" |  | ||||||
| 	"github.com/gogo/protobuf/types" | 	"github.com/gogo/protobuf/types" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -326,7 +326,7 @@ func (t *Task) Stats(ctx context.Context) (*types.Any, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return typeurl.MarshalAny(stats) | 	return protobuf.MarshalAnyToProto(stats) | ||||||
| } | } | ||||||
|  |  | ||||||
| // Cgroup returns the underlying cgroup for a linux task | // Cgroup returns the underlying cgroup for a linux task | ||||||
|   | |||||||
| @@ -37,6 +37,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/namespaces" | 	"github.com/containerd/containerd/namespaces" | ||||||
| 	"github.com/containerd/containerd/pkg/process" | 	"github.com/containerd/containerd/pkg/process" | ||||||
| 	"github.com/containerd/containerd/pkg/stdio" | 	"github.com/containerd/containerd/pkg/stdio" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/runtime" | 	"github.com/containerd/containerd/runtime" | ||||||
| 	"github.com/containerd/containerd/runtime/linux/runctypes" | 	"github.com/containerd/containerd/runtime/linux/runctypes" | ||||||
| 	shimapi "github.com/containerd/containerd/runtime/v1/shim/v1" | 	shimapi "github.com/containerd/containerd/runtime/v1/shim/v1" | ||||||
| @@ -417,7 +418,7 @@ func (s *Service) ListPids(ctx context.Context, r *shimapi.ListPidsRequest) (*sh | |||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					return nil, fmt.Errorf("failed to marshal process %d info: %w", pid, err) | 					return nil, fmt.Errorf("failed to marshal process %d info: %w", pid, err) | ||||||
| 				} | 				} | ||||||
| 				pInfo.Info = a | 				pInfo.Info = protobuf.FromAny(a) | ||||||
| 				break | 				break | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/pkg/timeout" | 	"github.com/containerd/containerd/pkg/timeout" | ||||||
| 	"github.com/containerd/containerd/platforms" | 	"github.com/containerd/containerd/platforms" | ||||||
| 	"github.com/containerd/containerd/plugin" | 	"github.com/containerd/containerd/plugin" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/runtime" | 	"github.com/containerd/containerd/runtime" | ||||||
| 	shimbinary "github.com/containerd/containerd/runtime/v2/shim" | 	shimbinary "github.com/containerd/containerd/runtime/v2/shim" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/task" | 	"github.com/containerd/containerd/runtime/v2/task" | ||||||
| @@ -157,7 +158,7 @@ func (m *ShimManager) ID() string { | |||||||
|  |  | ||||||
| // Start launches a new shim instance | // Start launches a new shim instance | ||||||
| func (m *ShimManager) Start(ctx context.Context, id string, opts runtime.CreateOpts) (_ ShimProcess, retErr error) { | func (m *ShimManager) Start(ctx context.Context, id string, opts runtime.CreateOpts) (_ ShimProcess, retErr error) { | ||||||
| 	bundle, err := NewBundle(ctx, m.root, m.state, id, opts.Spec.Value) | 	bundle, err := NewBundle(ctx, m.root, m.state, id, opts.Spec.GetValue()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -198,7 +199,7 @@ func (m *ShimManager) startShim(ctx context.Context, bundle *Bundle, id string, | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	topts := opts.TaskOptions | 	topts := opts.TaskOptions | ||||||
| 	if topts == nil { | 	if topts == nil || topts.GetValue() == nil { | ||||||
| 		topts = opts.RuntimeOptions | 		topts = opts.RuntimeOptions | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -213,7 +214,7 @@ func (m *ShimManager) startShim(ctx context.Context, bundle *Bundle, id string, | |||||||
| 		ttrpcAddress: m.containerdTTRPCAddress, | 		ttrpcAddress: m.containerdTTRPCAddress, | ||||||
| 		schedCore:    m.schedCore, | 		schedCore:    m.schedCore, | ||||||
| 	}) | 	}) | ||||||
| 	shim, err := b.Start(ctx, topts, func() { | 	shim, err := b.Start(ctx, protobuf.FromAny(topts), func() { | ||||||
| 		log.G(ctx).WithField("id", id).Info("shim disconnected") | 		log.G(ctx).WithField("id", id).Info("shim disconnected") | ||||||
|  |  | ||||||
| 		cleanupAfterDeadShim(context.Background(), id, ns, m.shims, m.events, b) | 		cleanupAfterDeadShim(context.Background(), id, ns, m.shims, m.events, b) | ||||||
|   | |||||||
| @@ -49,13 +49,15 @@ func NewContainer(ctx context.Context, platform stdio.Platform, r *task.CreateTa | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var opts options.Options | 	var opts options.Options | ||||||
| 	if r.Options != nil && r.Options.GetTypeUrl() != "" { | 	if r.Options.GetValue() != nil { | ||||||
| 		v, err := typeurl.UnmarshalAny(r.Options) | 		v, err := typeurl.UnmarshalAny(r.Options) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
|  | 		if v != nil { | ||||||
| 			opts = *v.(*options.Options) | 			opts = *v.(*options.Options) | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	var mounts []process.Mount | 	var mounts []process.Mount | ||||||
| 	for _, m := range r.Rootfs { | 	for _, m := range r.Rootfs { | ||||||
|   | |||||||
| @@ -38,6 +38,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/pkg/shutdown" | 	"github.com/containerd/containerd/pkg/shutdown" | ||||||
| 	"github.com/containerd/containerd/pkg/stdio" | 	"github.com/containerd/containerd/pkg/stdio" | ||||||
| 	"github.com/containerd/containerd/pkg/userns" | 	"github.com/containerd/containerd/pkg/userns" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/runc" | 	"github.com/containerd/containerd/runtime/v2/runc" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/runc/options" | 	"github.com/containerd/containerd/runtime/v2/runc/options" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/shim" | 	"github.com/containerd/containerd/runtime/v2/shim" | ||||||
| @@ -375,7 +376,7 @@ func (s *service) Pids(ctx context.Context, r *taskAPI.PidsRequest) (*taskAPI.Pi | |||||||
| 				d := &options.ProcessDetails{ | 				d := &options.ProcessDetails{ | ||||||
| 					ExecID: p.ID(), | 					ExecID: p.ID(), | ||||||
| 				} | 				} | ||||||
| 				a, err := typeurl.MarshalAny(d) | 				a, err := protobuf.MarshalAnyToProto(d) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					return nil, fmt.Errorf("failed to marshal process %d info: %w", pid, err) | 					return nil, fmt.Errorf("failed to marshal process %d info: %w", pid, err) | ||||||
| 				} | 				} | ||||||
| @@ -503,7 +504,7 @@ func (s *service) Stats(ctx context.Context, r *taskAPI.StatsRequest) (*taskAPI. | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return &taskAPI.StatsResponse{ | 	return &taskAPI.StatsResponse{ | ||||||
| 		Stats: data, | 		Stats: protobuf.FromAny(data), | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/pkg/process" | 	"github.com/containerd/containerd/pkg/process" | ||||||
| 	"github.com/containerd/containerd/pkg/schedcore" | 	"github.com/containerd/containerd/pkg/schedcore" | ||||||
| 	"github.com/containerd/containerd/pkg/stdio" | 	"github.com/containerd/containerd/pkg/stdio" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/runc" | 	"github.com/containerd/containerd/runtime/v2/runc" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/runc/options" | 	"github.com/containerd/containerd/runtime/v2/runc/options" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/shim" | 	"github.com/containerd/containerd/runtime/v2/shim" | ||||||
| @@ -505,7 +506,7 @@ func (s *service) Pids(ctx context.Context, r *taskAPI.PidsRequest) (*taskAPI.Pi | |||||||
| 				d := &options.ProcessDetails{ | 				d := &options.ProcessDetails{ | ||||||
| 					ExecID: p.ID(), | 					ExecID: p.ID(), | ||||||
| 				} | 				} | ||||||
| 				a, err := typeurl.MarshalAny(d) | 				a, err := protobuf.MarshalAnyToProto(d) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					return nil, fmt.Errorf("failed to marshal process %d info: %w", pid, err) | 					return nil, fmt.Errorf("failed to marshal process %d info: %w", pid, err) | ||||||
| 				} | 				} | ||||||
| @@ -615,7 +616,7 @@ func (s *service) Stats(ctx context.Context, r *taskAPI.StatsRequest) (*taskAPI. | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return &taskAPI.StatsResponse{ | 	return &taskAPI.StatsResponse{ | ||||||
| 		Stats: data, | 		Stats: protobuf.FromAny(data), | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -33,6 +33,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/log" | 	"github.com/containerd/containerd/log" | ||||||
| 	"github.com/containerd/containerd/namespaces" | 	"github.com/containerd/containerd/namespaces" | ||||||
| 	"github.com/containerd/containerd/pkg/timeout" | 	"github.com/containerd/containerd/pkg/timeout" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/runtime" | 	"github.com/containerd/containerd/runtime" | ||||||
| 	client "github.com/containerd/containerd/runtime/v2/shim" | 	client "github.com/containerd/containerd/runtime/v2/shim" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/task" | 	"github.com/containerd/containerd/runtime/v2/task" | ||||||
| @@ -323,7 +324,7 @@ func (s *shimTask) delete(ctx context.Context, removeTask func(ctx context.Conte | |||||||
|  |  | ||||||
| func (s *shimTask) Create(ctx context.Context, opts runtime.CreateOpts) (runtime.Task, error) { | func (s *shimTask) Create(ctx context.Context, opts runtime.CreateOpts) (runtime.Task, error) { | ||||||
| 	topts := opts.TaskOptions | 	topts := opts.TaskOptions | ||||||
| 	if topts == nil { | 	if topts == nil || topts.GetValue() == nil { | ||||||
| 		topts = opts.RuntimeOptions | 		topts = opts.RuntimeOptions | ||||||
| 	} | 	} | ||||||
| 	request := &task.CreateTaskRequest{ | 	request := &task.CreateTaskRequest{ | ||||||
| @@ -334,7 +335,7 @@ func (s *shimTask) Create(ctx context.Context, opts runtime.CreateOpts) (runtime | |||||||
| 		Stderr:     opts.IO.Stderr, | 		Stderr:     opts.IO.Stderr, | ||||||
| 		Terminal:   opts.IO.Terminal, | 		Terminal:   opts.IO.Terminal, | ||||||
| 		Checkpoint: opts.Checkpoint, | 		Checkpoint: opts.Checkpoint, | ||||||
| 		Options:    topts, | 		Options:    protobuf.FromAny(topts), | ||||||
| 	} | 	} | ||||||
| 	for _, m := range opts.Rootfs { | 	for _, m := range opts.Rootfs { | ||||||
| 		request.Rootfs = append(request.Rootfs, &types.Mount{ | 		request.Rootfs = append(request.Rootfs, &types.Mount{ | ||||||
|   | |||||||
| @@ -25,8 +25,8 @@ import ( | |||||||
| 	"github.com/containerd/containerd/events" | 	"github.com/containerd/containerd/events" | ||||||
| 	"github.com/containerd/containerd/namespaces" | 	"github.com/containerd/containerd/namespaces" | ||||||
| 	"github.com/containerd/containerd/pkg/ttrpcutil" | 	"github.com/containerd/containerd/pkg/ttrpcutil" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/ttrpc" | 	"github.com/containerd/ttrpc" | ||||||
| 	"github.com/containerd/typeurl" |  | ||||||
| 	"github.com/sirupsen/logrus" | 	"github.com/sirupsen/logrus" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -110,7 +110,7 @@ func (l *RemoteEventsPublisher) Publish(ctx context.Context, topic string, event | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	any, err := typeurl.MarshalAny(event) | 	any, err := protobuf.MarshalAnyToProto(event) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -19,6 +19,9 @@ package containers | |||||||
| import ( | import ( | ||||||
| 	api "github.com/containerd/containerd/api/services/containers/v1" | 	api "github.com/containerd/containerd/api/services/containers/v1" | ||||||
| 	"github.com/containerd/containerd/containers" | 	"github.com/containerd/containerd/containers" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
|  | 	"github.com/containerd/typeurl" | ||||||
|  | 	"github.com/gogo/protobuf/types" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func containersToProto(containers []containers.Container) []api.Container { | func containersToProto(containers []containers.Container) []api.Container { | ||||||
| @@ -33,20 +36,24 @@ func containersToProto(containers []containers.Container) []api.Container { | |||||||
| } | } | ||||||
|  |  | ||||||
| func containerToProto(container *containers.Container) api.Container { | func containerToProto(container *containers.Container) api.Container { | ||||||
|  | 	extensions := make(map[string]types.Any) | ||||||
|  | 	for k, v := range container.Extensions { | ||||||
|  | 		extensions[k] = *protobuf.FromAny(v) | ||||||
|  | 	} | ||||||
| 	return api.Container{ | 	return api.Container{ | ||||||
| 		ID:     container.ID, | 		ID:     container.ID, | ||||||
| 		Labels: container.Labels, | 		Labels: container.Labels, | ||||||
| 		Image:  container.Image, | 		Image:  container.Image, | ||||||
| 		Runtime: &api.Container_Runtime{ | 		Runtime: &api.Container_Runtime{ | ||||||
| 			Name:    container.Runtime.Name, | 			Name:    container.Runtime.Name, | ||||||
| 			Options: container.Runtime.Options, | 			Options: protobuf.FromAny(container.Runtime.Options), | ||||||
| 		}, | 		}, | ||||||
| 		Spec:        container.Spec, | 		Spec:        protobuf.FromAny(container.Spec), | ||||||
| 		Snapshotter: container.Snapshotter, | 		Snapshotter: container.Snapshotter, | ||||||
| 		SnapshotKey: container.SnapshotKey, | 		SnapshotKey: container.SnapshotKey, | ||||||
| 		CreatedAt:   container.CreatedAt, | 		CreatedAt:   container.CreatedAt, | ||||||
| 		UpdatedAt:   container.UpdatedAt, | 		UpdatedAt:   container.UpdatedAt, | ||||||
| 		Extensions:  container.Extensions, | 		Extensions:  extensions, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -58,6 +65,11 @@ func containerFromProto(containerpb *api.Container) containers.Container { | |||||||
| 			Options: containerpb.Runtime.Options, | 			Options: containerpb.Runtime.Options, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	extensions := make(map[string]typeurl.Any) | ||||||
|  | 	for k, v := range containerpb.Extensions { | ||||||
|  | 		v := v | ||||||
|  | 		extensions[k] = &v | ||||||
|  | 	} | ||||||
| 	return containers.Container{ | 	return containers.Container{ | ||||||
| 		ID:          containerpb.ID, | 		ID:          containerpb.ID, | ||||||
| 		Labels:      containerpb.Labels, | 		Labels:      containerpb.Labels, | ||||||
| @@ -66,6 +78,6 @@ func containerFromProto(containerpb *api.Container) containers.Container { | |||||||
| 		Spec:        containerpb.Spec, | 		Spec:        containerpb.Spec, | ||||||
| 		Snapshotter: containerpb.Snapshotter, | 		Snapshotter: containerpb.Snapshotter, | ||||||
| 		SnapshotKey: containerpb.SnapshotKey, | 		SnapshotKey: containerpb.SnapshotKey, | ||||||
| 		Extensions:  containerpb.Extensions, | 		Extensions:  extensions, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/events" | 	"github.com/containerd/containerd/events" | ||||||
| 	"github.com/containerd/containerd/events/exchange" | 	"github.com/containerd/containerd/events/exchange" | ||||||
| 	"github.com/containerd/containerd/plugin" | 	"github.com/containerd/containerd/plugin" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/ttrpc" | 	"github.com/containerd/ttrpc" | ||||||
| 	ptypes "github.com/gogo/protobuf/types" | 	ptypes "github.com/gogo/protobuf/types" | ||||||
| 	"google.golang.org/grpc" | 	"google.golang.org/grpc" | ||||||
| @@ -115,7 +116,7 @@ func toProto(env *events.Envelope) *api.Envelope { | |||||||
| 		Timestamp: env.Timestamp, | 		Timestamp: env.Timestamp, | ||||||
| 		Namespace: env.Namespace, | 		Namespace: env.Namespace, | ||||||
| 		Topic:     env.Topic, | 		Topic:     env.Topic, | ||||||
| 		Event:     env.Event, | 		Event:     protobuf.FromAny(env.Event), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/mount" | 	"github.com/containerd/containerd/mount" | ||||||
| 	"github.com/containerd/containerd/pkg/timeout" | 	"github.com/containerd/containerd/pkg/timeout" | ||||||
| 	"github.com/containerd/containerd/plugin" | 	"github.com/containerd/containerd/plugin" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/runtime" | 	"github.com/containerd/containerd/runtime" | ||||||
| 	"github.com/containerd/containerd/runtime/linux/runctypes" | 	"github.com/containerd/containerd/runtime/linux/runctypes" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/runc/options" | 	"github.com/containerd/containerd/runtime/v2/runc/options" | ||||||
| @@ -462,7 +463,7 @@ func (l *local) ListPids(ctx context.Context, r *api.ListPidsRequest, _ ...grpc. | |||||||
| 			Pid: p.Pid, | 			Pid: p.Pid, | ||||||
| 		} | 		} | ||||||
| 		if p.Info != nil { | 		if p.Info != nil { | ||||||
| 			a, err := typeurl.MarshalAny(p.Info) | 			a, err := protobuf.MarshalAnyToProto(p.Info) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return nil, fmt.Errorf("failed to marshal process %d info: %w", p.Pid, err) | 				return nil, fmt.Errorf("failed to marshal process %d info: %w", p.Pid, err) | ||||||
| 			} | 			} | ||||||
| @@ -577,7 +578,7 @@ func (l *local) Checkpoint(ctx context.Context, r *api.CheckpointTaskRequest, _ | |||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	// write the config to the content store | 	// write the config to the content store | ||||||
| 	data, err := container.Spec.Marshal() | 	data, err := protobuf.FromAny(container.Spec).Marshal() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								task.go
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								task.go
									
									
									
									
									
								
							| @@ -38,6 +38,7 @@ import ( | |||||||
| 	"github.com/containerd/containerd/mount" | 	"github.com/containerd/containerd/mount" | ||||||
| 	"github.com/containerd/containerd/oci" | 	"github.com/containerd/containerd/oci" | ||||||
| 	"github.com/containerd/containerd/plugin" | 	"github.com/containerd/containerd/plugin" | ||||||
|  | 	"github.com/containerd/containerd/protobuf" | ||||||
| 	"github.com/containerd/containerd/rootfs" | 	"github.com/containerd/containerd/rootfs" | ||||||
| 	"github.com/containerd/containerd/runtime/linux/runctypes" | 	"github.com/containerd/containerd/runtime/linux/runctypes" | ||||||
| 	"github.com/containerd/containerd/runtime/v2/runc/options" | 	"github.com/containerd/containerd/runtime/v2/runc/options" | ||||||
| @@ -346,7 +347,7 @@ func (t *task) Exec(ctx context.Context, id string, spec *specs.Process, ioCreat | |||||||
| 			i.Close() | 			i.Close() | ||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
| 	any, err := typeurl.MarshalAny(spec) | 	any, err := protobuf.MarshalAnyToProto(spec) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| @@ -446,7 +447,7 @@ func (t *task) Checkpoint(ctx context.Context, opts ...CheckpointTaskOpts) (Imag | |||||||
| 	} | 	} | ||||||
| 	request.ParentCheckpoint = i.ParentCheckpoint.String() | 	request.ParentCheckpoint = i.ParentCheckpoint.String() | ||||||
| 	if i.Options != nil { | 	if i.Options != nil { | ||||||
| 		any, err := typeurl.MarshalAny(i.Options) | 		any, err := protobuf.MarshalAnyToProto(i.Options) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
| @@ -535,7 +536,7 @@ func (t *task) Update(ctx context.Context, opts ...UpdateTaskOpts) error { | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		request.Resources = any | 		request.Resources = protobuf.FromAny(any) | ||||||
| 	} | 	} | ||||||
| 	if i.Annotations != nil { | 	if i.Annotations != nil { | ||||||
| 		request.Annotations = i.Annotations | 		request.Annotations = i.Annotations | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/typeurl/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/typeurl/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -7,7 +7,7 @@ | |||||||
|  |  | ||||||
| A Go package for managing the registration, marshaling, and unmarshaling of encoded types. | A Go package for managing the registration, marshaling, and unmarshaling of encoded types. | ||||||
|  |  | ||||||
| This package helps when types are sent over a GRPC API and marshaled as a [protobuf.Any](https://github.com/gogo/protobuf/blob/master/protobuf/google/protobuf/any.proto). | This package helps when types are sent over a ttrpc/GRPC API and marshaled as a protobuf [Any](https://pkg.go.dev/google.golang.org/protobuf@v1.27.1/types/known/anypb#Any) | ||||||
|  |  | ||||||
| ## Project details | ## Project details | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										91
									
								
								vendor/github.com/containerd/typeurl/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										91
									
								
								vendor/github.com/containerd/typeurl/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -18,13 +18,14 @@ package typeurl | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
| 	"path" | 	"path" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"sync" | 	"sync" | ||||||
|  |  | ||||||
| 	"github.com/gogo/protobuf/proto" | 	gogoproto "github.com/gogo/protobuf/proto" | ||||||
| 	"github.com/gogo/protobuf/types" | 	"google.golang.org/protobuf/proto" | ||||||
| 	"github.com/pkg/errors" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| @@ -39,10 +40,35 @@ var ( | |||||||
| // | // | ||||||
| // To detect an error class, use errors.Is() functions to tell whether an | // To detect an error class, use errors.Is() functions to tell whether an | ||||||
| // error is of this type. | // error is of this type. | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| 	ErrNotFound = errors.New("not found") | 	ErrNotFound = errors.New("not found") | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | type Any interface { | ||||||
|  | 	GetTypeUrl() string | ||||||
|  | 	GetValue() []byte | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type any struct { | ||||||
|  | 	typeURL string | ||||||
|  | 	value   []byte | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (a *any) GetTypeUrl() string { | ||||||
|  | 	if a == nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return a.typeURL | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (a *any) GetValue() []byte { | ||||||
|  | 	if a == nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return a.value | ||||||
|  | } | ||||||
|  |  | ||||||
| // Register a type with a base URL for JSON marshaling. When the MarshalAny and | // Register a type with a base URL for JSON marshaling. When the MarshalAny and | ||||||
| // UnmarshalAny functions are called they will treat the Any type value as JSON. | // UnmarshalAny functions are called they will treat the Any type value as JSON. | ||||||
| // To use protocol buffers for handling the Any value the proto.Register | // To use protocol buffers for handling the Any value the proto.Register | ||||||
| @@ -56,7 +82,7 @@ func Register(v interface{}, args ...string) { | |||||||
| 	defer mu.Unlock() | 	defer mu.Unlock() | ||||||
| 	if et, ok := registry[t]; ok { | 	if et, ok := registry[t]; ok { | ||||||
| 		if et != p { | 		if et != p { | ||||||
| 			panic(errors.Errorf("type registered with alternate path %q != %q", et, p)) | 			panic(fmt.Errorf("type registered with alternate path %q != %q", et, p)) | ||||||
| 		} | 		} | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -69,41 +95,47 @@ func TypeURL(v interface{}) (string, error) { | |||||||
| 	u, ok := registry[tryDereference(v)] | 	u, ok := registry[tryDereference(v)] | ||||||
| 	mu.RUnlock() | 	mu.RUnlock() | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		// fallback to the proto registry if it is a proto message | 		switch t := v.(type) { | ||||||
| 		pb, ok := v.(proto.Message) | 		case proto.Message: | ||||||
| 		if !ok { | 			return string(t.ProtoReflect().Descriptor().FullName()), nil | ||||||
| 			return "", errors.Wrapf(ErrNotFound, "type %s", reflect.TypeOf(v)) | 		case gogoproto.Message: | ||||||
|  | 			return gogoproto.MessageName(t), nil | ||||||
|  | 		default: | ||||||
|  | 			return "", fmt.Errorf("type %s: %w", reflect.TypeOf(v), ErrNotFound) | ||||||
| 		} | 		} | ||||||
| 		return proto.MessageName(pb), nil |  | ||||||
| 	} | 	} | ||||||
| 	return u, nil | 	return u, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Is returns true if the type of the Any is the same as v. | // Is returns true if the type of the Any is the same as v. | ||||||
| func Is(any *types.Any, v interface{}) bool { | func Is(any Any, v interface{}) bool { | ||||||
| 	// call to check that v is a pointer | 	// call to check that v is a pointer | ||||||
| 	tryDereference(v) | 	tryDereference(v) | ||||||
| 	url, err := TypeURL(v) | 	url, err := TypeURL(v) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
| 	return any.TypeUrl == url | 	return any.GetTypeUrl() == url | ||||||
| } | } | ||||||
|  |  | ||||||
| // MarshalAny marshals the value v into an any with the correct TypeUrl. | // MarshalAny marshals the value v into an any with the correct TypeUrl. | ||||||
| // If the provided object is already a proto.Any message, then it will be | // If the provided object is already a proto.Any message, then it will be | ||||||
| // returned verbatim. If it is of type proto.Message, it will be marshaled as a | // returned verbatim. If it is of type proto.Message, it will be marshaled as a | ||||||
| // protocol buffer. Otherwise, the object will be marshaled to json. | // protocol buffer. Otherwise, the object will be marshaled to json. | ||||||
| func MarshalAny(v interface{}) (*types.Any, error) { | func MarshalAny(v interface{}) (Any, error) { | ||||||
| 	var marshal func(v interface{}) ([]byte, error) | 	var marshal func(v interface{}) ([]byte, error) | ||||||
| 	switch t := v.(type) { | 	switch t := v.(type) { | ||||||
| 	case *types.Any: | 	case Any: | ||||||
| 		// avoid reserializing the type if we have an any. | 		// avoid reserializing the type if we have an any. | ||||||
| 		return t, nil | 		return t, nil | ||||||
| 	case proto.Message: | 	case proto.Message: | ||||||
| 		marshal = func(v interface{}) ([]byte, error) { | 		marshal = func(v interface{}) ([]byte, error) { | ||||||
| 			return proto.Marshal(t) | 			return proto.Marshal(t) | ||||||
| 		} | 		} | ||||||
|  | 	case gogoproto.Message: | ||||||
|  | 		marshal = func(v interface{}) ([]byte, error) { | ||||||
|  | 			return gogoproto.Marshal(t) | ||||||
|  | 		} | ||||||
| 	default: | 	default: | ||||||
| 		marshal = json.Marshal | 		marshal = json.Marshal | ||||||
| 	} | 	} | ||||||
| @@ -117,15 +149,15 @@ func MarshalAny(v interface{}) (*types.Any, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return &types.Any{ | 	return &any{ | ||||||
| 		TypeUrl: url, | 		typeURL: url, | ||||||
| 		Value:   data, | 		value:   data, | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // UnmarshalAny unmarshals the any type into a concrete type. | // UnmarshalAny unmarshals the any type into a concrete type. | ||||||
| func UnmarshalAny(any *types.Any) (interface{}, error) { | func UnmarshalAny(any Any) (interface{}, error) { | ||||||
| 	return UnmarshalByTypeURL(any.TypeUrl, any.Value) | 	return UnmarshalByTypeURL(any.GetTypeUrl(), any.GetValue()) | ||||||
| } | } | ||||||
|  |  | ||||||
| // UnmarshalByTypeURL unmarshals the given type and value to into a concrete type. | // UnmarshalByTypeURL unmarshals the given type and value to into a concrete type. | ||||||
| @@ -136,11 +168,11 @@ func UnmarshalByTypeURL(typeURL string, value []byte) (interface{}, error) { | |||||||
| // UnmarshalTo unmarshals the any type into a concrete type passed in the out | // UnmarshalTo unmarshals the any type into a concrete type passed in the out | ||||||
| // argument. It is identical to UnmarshalAny, but lets clients provide a | // argument. It is identical to UnmarshalAny, but lets clients provide a | ||||||
| // destination type through the out argument. | // destination type through the out argument. | ||||||
| func UnmarshalTo(any *types.Any, out interface{}) error { | func UnmarshalTo(any Any, out interface{}) error { | ||||||
| 	return UnmarshalToByTypeURL(any.TypeUrl, any.Value, out) | 	return UnmarshalToByTypeURL(any.GetTypeUrl(), any.GetValue(), out) | ||||||
| } | } | ||||||
|  |  | ||||||
| // UnmarshalTo unmarshals the given type and value into a concrete type passed | // UnmarshalToByTypeURL unmarshals the given type and value into a concrete type passed | ||||||
| // in the out argument. It is identical to UnmarshalByTypeURL, but lets clients | // in the out argument. It is identical to UnmarshalByTypeURL, but lets clients | ||||||
| // provide a destination type through the out argument. | // provide a destination type through the out argument. | ||||||
| func UnmarshalToByTypeURL(typeURL string, value []byte, out interface{}) error { | func UnmarshalToByTypeURL(typeURL string, value []byte, out interface{}) error { | ||||||
| @@ -149,6 +181,10 @@ func UnmarshalToByTypeURL(typeURL string, value []byte, out interface{}) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error) { | func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error) { | ||||||
|  | 	if value == nil { | ||||||
|  | 		return nil, nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	t, err := getTypeByUrl(typeURL) | 	t, err := getTypeByUrl(typeURL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @@ -163,12 +199,17 @@ func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error) | |||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
| 		if typeURL != vURL { | 		if typeURL != vURL { | ||||||
| 			return nil, errors.Errorf("can't unmarshal type %q to output %q", typeURL, vURL) | 			return nil, fmt.Errorf("can't unmarshal type %q to output %q", typeURL, vURL) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if t.isProto { | 	if t.isProto { | ||||||
| 		err = proto.Unmarshal(value, v.(proto.Message)) | 		switch t := v.(type) { | ||||||
|  | 		case proto.Message: | ||||||
|  | 			err = proto.Unmarshal(value, t) | ||||||
|  | 		case gogoproto.Message: | ||||||
|  | 			err = gogoproto.Unmarshal(value, t) | ||||||
|  | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		err = json.Unmarshal(value, v) | 		err = json.Unmarshal(value, v) | ||||||
| 	} | 	} | ||||||
| @@ -193,7 +234,7 @@ func getTypeByUrl(url string) (urlType, error) { | |||||||
| 	} | 	} | ||||||
| 	mu.RUnlock() | 	mu.RUnlock() | ||||||
| 	// fallback to proto registry | 	// fallback to proto registry | ||||||
| 	t := proto.MessageType(url) | 	t := gogoproto.MessageType(url) | ||||||
| 	if t != nil { | 	if t != nil { | ||||||
| 		return urlType{ | 		return urlType{ | ||||||
| 			// get the underlying Elem because proto returns a pointer to the type | 			// get the underlying Elem because proto returns a pointer to the type | ||||||
| @@ -201,7 +242,7 @@ func getTypeByUrl(url string) (urlType, error) { | |||||||
| 			isProto: true, | 			isProto: true, | ||||||
| 		}, nil | 		}, nil | ||||||
| 	} | 	} | ||||||
| 	return urlType{}, errors.Wrapf(ErrNotFound, "type with url %s", url) | 	return urlType{}, fmt.Errorf("type with url %s: %w", url, ErrNotFound) | ||||||
| } | } | ||||||
|  |  | ||||||
| func tryDereference(v interface{}) reflect.Type { | func tryDereference(v interface{}) reflect.Type { | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							| @@ -116,7 +116,7 @@ github.com/containerd/nri/types/v1 | |||||||
| ## explicit; go 1.13 | ## explicit; go 1.13 | ||||||
| github.com/containerd/ttrpc | github.com/containerd/ttrpc | ||||||
| github.com/containerd/ttrpc/plugin | github.com/containerd/ttrpc/plugin | ||||||
| # github.com/containerd/typeurl v1.0.2 | # github.com/containerd/typeurl v1.0.3-0.20220324183432-6193a0e03259 | ||||||
| ## explicit; go 1.13 | ## explicit; go 1.13 | ||||||
| github.com/containerd/typeurl | github.com/containerd/typeurl | ||||||
| # github.com/containerd/zfs v1.0.0 | # github.com/containerd/zfs v1.0.0 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Phil Estes
					Phil Estes