// Get looks up the hosts containers with the specified ID // or name and returns it, or an error. func Get(ctx context.Context, clientInstance client.ContainerAPIClient, id string) (*types.ContainerJSON, error) { container, err := clientInstance.ContainerInspect(ctx, id) if err != nil { if client.IsErrContainerNotFound(err) { return nil, nil } return nil, err } return &container, nil }
// getExecExitCode perform an inspect on the exec command. It returns // the running state and the exit code. func getExecExitCode(ctx context.Context, client apiclient.ContainerAPIClient, execID string) (bool, int, error) { resp, err := client.ContainerExecInspect(ctx, execID) if err != nil { // If we can't connect, then the daemon probably died. if !apiclient.IsErrConnectionFailed(err) { return false, -1, err } return false, -1, nil } return resp.Running, resp.ExitCode, nil }
// Create creates a container and return a Container struct (and an error if any) func Create(ctx context.Context, client client.ContainerAPIClient, name string, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig) (*Container, error) { container, err := client.ContainerCreate(ctx, config, hostConfig, networkingConfig, name) if err != nil { return nil, err } return New(ctx, client, container.ID) }
// ListByFilter looks up the hosts containers with the specified filters and // returns a list of container matching it, or an error. func ListByFilter(ctx context.Context, clientInstance client.ContainerAPIClient, containerFilters ...map[string][]string) ([]types.Container, error) { filterArgs := filters.NewArgs() // FIXME(vdemeester) I don't like 3 for loops >_< for _, filter := range containerFilters { for key, filterValue := range filter { for _, value := range filterValue { filterArgs.Add(key, value) } } } return clientInstance.ContainerList(ctx, types.ContainerListOptions{ All: true, Filter: filterArgs, }) }
// resizeTtyTo resizes tty to specific height and width func resizeTtyTo(ctx context.Context, client apiclient.ContainerAPIClient, id string, height, width int, isExec bool) { if height == 0 && width == 0 { return } options := types.ResizeOptions{ Height: height, Width: width, } var err error if isExec { err = client.ContainerExecResize(ctx, id, options) } else { err = client.ContainerResize(ctx, id, options) } if err != nil { logrus.Debugf("Error resize: %s", err) } }
// NewNamer returns a namer that returns names based on the specified project and // service name and an inner counter, e.g. project_service_1, project_service_2… func NewNamer(ctx context.Context, client client.ContainerAPIClient, project, service string, oneOff bool) (Namer, error) { namer := &defaultNamer{ project: project, service: service, oneOff: oneOff, } filter := filters.NewArgs() filter.Add("label", fmt.Sprintf("%s=%s", labels.PROJECT.Str(), project)) filter.Add("label", fmt.Sprintf("%s=%s", labels.SERVICE.Str(), service)) if oneOff { filter.Add("label", fmt.Sprintf("%s=%s", labels.ONEOFF.Str(), "True")) } else { filter.Add("label", fmt.Sprintf("%s=%s", labels.ONEOFF.Str(), "False")) } containers, err := client.ContainerList(ctx, types.ContainerListOptions{ All: true, Filter: filter, }) if err != nil { return nil, err } maxNumber := 0 for _, container := range containers { number, err := strconv.Atoi(container.Labels[labels.NUMBER.Str()]) if err != nil { return nil, err } if number > maxNumber { maxNumber = number } } namer.currentNumber = maxNumber + 1 return namer, nil }