| 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 |
| } |