dotcloud/docker

View on GitHub
libcontainerd/shimopts/convert.go

Summary

Maintainability
A
0 mins
Test Coverage
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
}