blob: b5ef8f52a9ffb9f0e0b93494276016bb4feb4b82 [file] [log] [blame]
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
}