func operationWaitGet(d *Daemon, r *http.Request) Response { targetStatus, err := shared.AtoiEmptyDefault(r.FormValue("status_code"), int(shared.Success)) if err != nil { return InternalError(err) } timeout, err := shared.AtoiEmptyDefault(r.FormValue("timeout"), -1) if err != nil { return InternalError(err) } operationLock.Lock() id := shared.OperationsURL(mux.Vars(r)["id"]) op, ok := operations[id] if !ok { operationLock.Unlock() return NotFound } status := op.StatusCode operationLock.Unlock() if int(status) != targetStatus && (status == shared.Pending || status == shared.Running) { if timeout >= 0 { select { case <-op.Chan: break case <-time.After(time.Duration(timeout) * time.Second): break } } else { <-op.Chan } } operationLock.Lock() defer operationLock.Unlock() return SyncResponse(true, op) }
func operationAPIWaitGet(d *Daemon, r *http.Request) Response { timeout, err := shared.AtoiEmptyDefault(r.FormValue("timeout"), -1) if err != nil { return InternalError(err) } id := mux.Vars(r)["id"] op, err := operationGet(id) if err != nil { return NotFound } _, err = op.WaitFinal(timeout) if err != nil { return InternalError(err) } _, body, err := op.Render() if err != nil { return InternalError(err) } return SyncResponse(true, body) }