api/services/instrospection: add PluginInfo
The new `PlunginInfo()` call can be used for instrospecting the details
of the runtime plugin.
```console
$ ctr plugins inspect-runtime --runtime=io.containerd.runc.v2 --runc-binary=runc
{
    "Name": "io.containerd.runc.v2",
    "Version": {
        "Version": "v2.0.0-beta.0-XX-gXXXXXXXXX.m",
        "Revision": "v2.0.0-beta.0-XX-gXXXXXXXXX.m"
    },
    "Options": {
        "binary_name": "runc"
    },
    "Features": {
        "ociVersionMin": "1.0.0",
        "ociVersionMax": "1.1.0-rc.2",
        ...,
    },
    "Annotations": null
}
```
The shim binary has to support `-info` flag, see `runtime/v2/README.md`
Replaces PR 8509 (`api/services/task: add RuntimeInfo()`)
Co-authored-by: Derek McGowan <derek@mcg.dev>
Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
			
			
This commit is contained in:
		@@ -34,10 +34,8 @@ import (
 | 
			
		||||
	"github.com/containerd/containerd/v2/contrib/nvidia"
 | 
			
		||||
	"github.com/containerd/containerd/v2/contrib/seccomp"
 | 
			
		||||
	"github.com/containerd/containerd/v2/core/containers"
 | 
			
		||||
	"github.com/containerd/containerd/v2/core/runtime/v2/runc/options"
 | 
			
		||||
	"github.com/containerd/containerd/v2/core/snapshots"
 | 
			
		||||
	"github.com/containerd/containerd/v2/pkg/oci"
 | 
			
		||||
	runtimeoptions "github.com/containerd/containerd/v2/pkg/runtimeoptions/v1"
 | 
			
		||||
	"github.com/containerd/log"
 | 
			
		||||
	"github.com/containerd/platforms"
 | 
			
		||||
	"github.com/intel/goresctrl/pkg/blockio"
 | 
			
		||||
@@ -48,18 +46,6 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var platformRunFlags = []cli.Flag{
 | 
			
		||||
	cli.StringFlag{
 | 
			
		||||
		Name:  "runc-binary",
 | 
			
		||||
		Usage: "Specify runc-compatible binary",
 | 
			
		||||
	},
 | 
			
		||||
	cli.StringFlag{
 | 
			
		||||
		Name:  "runc-root",
 | 
			
		||||
		Usage: "Specify runc-compatible root",
 | 
			
		||||
	},
 | 
			
		||||
	cli.BoolFlag{
 | 
			
		||||
		Name:  "runc-systemd-cgroup",
 | 
			
		||||
		Usage: "Start runc with systemd cgroup manager",
 | 
			
		||||
	},
 | 
			
		||||
	cli.StringFlag{
 | 
			
		||||
		Name:  "uidmap",
 | 
			
		||||
		Usage: "Run inside a user namespace with the specified UID mapping range; specified with the format `container-uid:host-uid:length`",
 | 
			
		||||
@@ -413,7 +399,7 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli
 | 
			
		||||
		cOpts = append(cOpts, containerd.WithContainerExtension(commands.CtrCniMetadataExtension, cniMeta))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	runtimeOpts, err := getRuntimeOptions(context)
 | 
			
		||||
	runtimeOpts, err := commands.RuntimeOptions(context)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -430,45 +416,6 @@ func NewContainer(ctx gocontext.Context, client *containerd.Client, context *cli
 | 
			
		||||
	return client.NewContainer(ctx, id, cOpts...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getRuncOptions(context *cli.Context) (*options.Options, error) {
 | 
			
		||||
	runtimeOpts := &options.Options{}
 | 
			
		||||
	if runcBinary := context.String("runc-binary"); runcBinary != "" {
 | 
			
		||||
		runtimeOpts.BinaryName = runcBinary
 | 
			
		||||
	}
 | 
			
		||||
	if context.Bool("runc-systemd-cgroup") {
 | 
			
		||||
		if context.String("cgroup") == "" {
 | 
			
		||||
			// runc maps "machine.slice:foo:deadbeef" to "/machine.slice/foo-deadbeef.scope"
 | 
			
		||||
			return nil, errors.New("option --runc-systemd-cgroup requires --cgroup to be set, e.g. \"machine.slice:foo:deadbeef\"")
 | 
			
		||||
		}
 | 
			
		||||
		runtimeOpts.SystemdCgroup = true
 | 
			
		||||
	}
 | 
			
		||||
	if root := context.String("runc-root"); root != "" {
 | 
			
		||||
		runtimeOpts.Root = root
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return runtimeOpts, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getRuntimeOptions(context *cli.Context) (interface{}, error) {
 | 
			
		||||
	// validate first
 | 
			
		||||
	if (context.String("runc-binary") != "" || context.Bool("runc-systemd-cgroup")) &&
 | 
			
		||||
		context.String("runtime") != "io.containerd.runc.v2" {
 | 
			
		||||
		return nil, errors.New("specifying runc-binary and runc-systemd-cgroup is only supported for \"io.containerd.runc.v2\" runtime")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if context.String("runtime") == "io.containerd.runc.v2" {
 | 
			
		||||
		return getRuncOptions(context)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if configPath := context.String("runtime-config-path"); configPath != "" {
 | 
			
		||||
		return &runtimeoptions.Options{
 | 
			
		||||
			ConfigPath: configPath,
 | 
			
		||||
		}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseIDMapping(mapping string) (specs.LinuxIDMapping, error) {
 | 
			
		||||
	// We expect 3 parts, but limit to 4 to allow detection of invalid values.
 | 
			
		||||
	parts := strings.SplitN(mapping, ":", 4)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user