package shimopts import ( runhcsoptions "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options" runtimeoptions "github.com/containerd/containerd/pkg/runtimeoptions/v1" "github.com/containerd/containerd/plugin" runcoptions "github.com/containerd/containerd/runtime/v2/runc/options" "github.com/pelletier/go-toml" ) // Generate converts opts into a runtime options value for the runtimeType which // can be passed into containerd. func Generate(runtimeType string, opts map[string]interface{}) (interface{}, error) { // This is horrible, but we have no other choice. The containerd client // can only handle options values which can be marshaled into a // typeurl.Any. And we're in good company: cri-containerd handles shim // options in the same way. var out interface{} switch runtimeType { case plugin.RuntimeRuncV1, plugin.RuntimeRuncV2: out = &runcoptions.Options{} case "io.containerd.runhcs.v1": out = &runhcsoptions.Options{} default: out = &runtimeoptions.Options{} } // We can't use mergo.Map as it is too strict about type-assignability // with numeric types. tree, err := toml.TreeFromMap(opts) if err != nil { return nil, err } if err := tree.Unmarshal(out); err != nil { return nil, err } return out, nil }