// 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, }) }
// 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 }