func waitForUnitStarted(stateConn *state.State, unit *state.Unit, c *C) { timeout := time.After(5 * time.Second) for { select { case <-timeout: c.Fatalf("no activity detected") case <-time.After(testing.ShortWait): err := unit.Refresh() c.Assert(err, IsNil) st, info, err := unit.Status() c.Assert(err, IsNil) switch st { case params.StatusPending, params.StatusInstalled: c.Logf("waiting...") continue case params.StatusStarted: c.Logf("started!") return case params.StatusDown: stateConn.StartSync() c.Logf("unit is still down") default: c.Fatalf("unexpected status %s %s", st, info) } } } }
// Resolved marks the unit as having had any previous state transition // problems resolved, and informs the unit that it may attempt to // reestablish normal workflow. The retryHooks parameter informs // whether to attempt to reexecute previous failed hooks or to continue // as if they had succeeded before. func (conn *Conn) Resolved(unit *state.Unit, retryHooks bool) error { status, _, err := unit.Status() if err != nil { return err } if status != state.UnitError { return fmt.Errorf("unit %q is not in an error state", unit) } mode := state.ResolvedNoHooks if retryHooks { mode = state.ResolvedRetryHooks } return unit.SetResolved(mode) }