podman wait can take multiple conditions

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 <dwalsh@redhat.com>
This commit is contained in:
Daniel J Walsh
2022-07-04 07:13:51 -04:00
parent a2bcf833c9
commit 96dd57ca50
4 changed files with 17 additions and 20 deletions

View File

@ -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) {
@ -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)
}
@ -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 {

View File

@ -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{}
@ -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)

View File

@ -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

View File

@ -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