func runTorContainer(cli *client.Client, ident, imageID, network string) (string, error) { config := &types.ContainerCreateConfig{ Name: ident, Config: &containerTypes.Config{ Image: imageID, }, } resp, err := cli.ContainerCreate(config.Config, config.HostConfig, config.NetworkingConfig, config.Name) if err != nil { return "", err } // TODO: Remove container on failure. for _, warning := range resp.Warnings { log.Warn(warning) } if err := cli.ContainerStart(resp.ID); err != nil { return "", err } // Connect to the network. if err := cli.NetworkConnect(network, resp.ID, nil); err != nil { return "", err } return resp.ID, err }
// runs a command in a container , with volume mounted // returns completion code. // exits (t.Fatal() or create/start/wait errors func runContainerCmd(t *testing.T, client *client.Client, volumeName string, image string, cmd *strslice.StrSlice, addr string) int { mountPoint := getMountpoint(volumeName) bind := volumeName + ":" + mountPoint t.Logf("Running cmd=%v with vol=%s on client %s", cmd, volumeName, addr) r, err := client.ContainerCreate(context.Background(), &container.Config{Image: image, Cmd: *cmd, Volumes: map[string]struct{}{mountPoint: {}}}, &container.HostConfig{Binds: []string{bind}}, nil, "") if err != nil { t.Fatalf("\tContainer create failed: %v", err) } err = client.ContainerStart(context.Background(), r.ID, types.ContainerStartOptions{}) if err != nil { t.Fatalf("\tContainer start failed: id=%s, err %v", r.ID, err) } code, err := client.ContainerWait(context.Background(), r.ID) if err != nil { t.Fatalf("\tContainer wait failed: id=%s, err %v", r.ID, err) } if removeContainers == false { t.Logf("\tSkipping container removal, id=%s (removeContainers == false)", r.ID) return code } err = client.ContainerRemove(context.Background(), r.ID, types.ContainerRemoveOptions{ RemoveVolumes: true, Force: true, }) if err != nil { t.Fatalf("\nContainer removal failed: %v", err) } return code }