| package volumes | |
| import ( | |
| "context" | |
| "os" | |
| "os/exec" | |
| "path/filepath" | |
| "testing" | |
| "time" | |
| "github.com/moby/locker" | |
| plugintypes "github.com/moby/moby/api/types/plugin" | |
| "github.com/moby/moby/v2/internal/testutil/fixtures/plugin" | |
| "github.com/pkg/errors" | |
| "gotest.tools/v3/assert" | |
| ) | |
| var pluginBuildLock = locker.New() | |
| // ensurePlugin makes the that a plugin binary has been installed on the system. | |
| // Plugins that have not been installed are built from `cmd/<name>`. | |
| func ensurePlugin(t *testing.T, name string) string { | |
| pluginBuildLock.Lock(name) | |
| defer pluginBuildLock.Unlock(name) | |
| goPath := os.Getenv("GOPATH") | |
| if goPath == "" { | |
| goPath = "/go" | |
| } | |
| installPath := filepath.Join(goPath, "bin", name) | |
| if _, err := os.Stat(installPath); err == nil { | |
| return installPath | |
| } | |
| goBin, err := exec.LookPath("go") | |
| assert.NilError(t, err) | |
| cmd := exec.Command(goBin, "build", "-o", installPath, "./"+filepath.Join("cmd", name)) | |
| cmd.Env = append(os.Environ(), "CGO_ENABLED=0", "GO111MODULE=off") | |
| if out, err := cmd.CombinedOutput(); err != nil { | |
| t.Fatal(errors.Wrapf(err, "error building basic plugin bin: %s", string(out))) | |
| } | |
| return installPath | |
| } | |
| func withSockPath(name string) func(*plugin.Config) { | |
| return func(cfg *plugin.Config) { | |
| cfg.Interface.Socket = name | |
| } | |
| } | |
| func createPlugin(ctx context.Context, t *testing.T, client plugin.CreateClient, alias, bin string, opts ...plugin.CreateOpt) { | |
| pluginBin := ensurePlugin(t, bin) | |
| opts = append(opts, withSockPath("plugin.sock")) | |
| opts = append(opts, plugin.WithBinary(pluginBin)) | |
| ctx, cancel := context.WithTimeout(ctx, 60*time.Second) | |
| err := plugin.Create(ctx, client, alias, opts...) | |
| cancel() | |
| assert.NilError(t, err) | |
| } | |
| func asVolumeDriver(cfg *plugin.Config) { | |
| cfg.Interface.Types = []plugintypes.CapabilityID{ | |
| {Capability: "volumedriver", Prefix: "docker", Version: "1.0"}, | |
| } | |
| } |