Skip to content

Commit

Permalink
podman wait can take multiple conditions
Browse files Browse the repository at this point in the history
Podman wait should not be defaulting to just stopped.  By default
wait API waits for stopped and exited.  We should not override this on
the client side.

Signed-off-by: Daniel J Walsh <[email protected]>
  • Loading branch information
rhatdan committed Jul 8, 2022
1 parent a2bcf83 commit 96dd57c
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 20 deletions.
18 changes: 10 additions & 8 deletions cmd/podman/containers/wait.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ var (
)

var (
waitOptions = entities.WaitOptions{}
waitCondition string
waitInterval string
waitOptions = entities.WaitOptions{}
waitConditions []string
waitInterval string
)

func waitFlags(cmd *cobra.Command) {
Expand All @@ -54,7 +54,7 @@ func waitFlags(cmd *cobra.Command) {
_ = cmd.RegisterFlagCompletionFunc(intervalFlagName, completion.AutocompleteNone)

conditionFlagName := "condition"
flags.StringVar(&waitCondition, conditionFlagName, "stopped", "Condition to wait on")
flags.StringSliceVar(&waitConditions, conditionFlagName, []string{}, "Condition to wait on")
_ = cmd.RegisterFlagCompletionFunc(conditionFlagName, common.AutocompleteWaitCondition)
}

Expand Down Expand Up @@ -92,11 +92,13 @@ func wait(cmd *cobra.Command, args []string) error {
return errors.New("--latest and containers cannot be used together")
}

cond, err := define.StringToContainerStatus(waitCondition)
if err != nil {
return err
for _, condition := range waitConditions {
cond, err := define.StringToContainerStatus(condition)
if err != nil {
return err
}
waitOptions.Condition = append(waitOptions.Condition, cond)
}
waitOptions.Condition = []define.ContainerStatus{cond}

responses, err := registry.ContainerEngine().ContainerWait(context.Background(), args, waitOptions)
if err != nil {
Expand Down
14 changes: 3 additions & 11 deletions pkg/api/handlers/utils/containers.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,8 @@ func WaitContainerDocker(w http.ResponseWriter, r *http.Request) {

func WaitContainerLibpod(w http.ResponseWriter, r *http.Request) {
var (
err error
interval = time.Millisecond * 250
conditions = []define.ContainerStatus{define.ContainerStateStopped, define.ContainerStateExited}
err error
interval = time.Millisecond * 250
)
decoder := r.Context().Value(api.DecoderKey).(*schema.Decoder)
query := waitQueryLibpod{}
Expand All @@ -118,17 +117,10 @@ func WaitContainerLibpod(w http.ResponseWriter, r *http.Request) {
}
}

if _, found := r.URL.Query()["condition"]; found {
if len(query.Condition) > 0 {
conditions = query.Condition
}
}

name := GetName(r)

waitFn := createContainerWaitFn(r.Context(), name, interval)

exitCode, err := waitFn(conditions...)
exitCode, err := waitFn(query.Condition...)
if err != nil {
if errors.Is(err, define.ErrNoSuchCtr) {
ContainerNotFound(w, name, err)
Expand Down
3 changes: 3 additions & 0 deletions pkg/domain/infra/abi/containers.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,9 @@ func (ic *ContainerEngine) ContainerWait(ctx context.Context, namesOrIds []strin
responses := make([]entities.WaitReport, 0, len(ctrs))
for _, c := range ctrs {
response := entities.WaitReport{Id: c.ID()}
if options.Condition == nil {
options.Condition = []define.ContainerStatus{define.ContainerStateStopped, define.ContainerStateExited}
}
exitCode, err := c.WaitForConditionWithInterval(ctx, options.Interval, options.Condition...)
if err != nil {
response.Error = err
Expand Down
2 changes: 1 addition & 1 deletion test/system/035-logs.bats
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ function _log_test_restarted() {
# FIXME: #9597
# run/start is flaking for remote so let's wait for the container condition
# to stop wasting energy until the root cause gets fixed.
run_podman container wait --condition=exited logtest
run_podman container wait --condition=exited --condition=stopped logtest
run_podman ${events_backend} start -a logtest
logfile=$(mktemp -p ${PODMAN_TMPDIR} logfileXXXXXXXX)
$PODMAN $_PODMAN_TEST_OPTS ${events_backend} logs -f logtest > $logfile
Expand Down

0 comments on commit 96dd57c

Please sign in to comment.