func (pc *PasswordChanger) setMongoPassword(entity state.Entity, password string) error { type mongoPassworder interface { SetMongoPassword(password string) error } // We set the mongo password first on the grounds that // if it fails, the agent in question should still be able // to authenticate to another API server and ask it to change // its password. if entity0, ok := entity.(mongoPassworder); ok { if err := entity0.SetMongoPassword(password); err != nil { return err } logger.Infof("setting mongo password for %q", entity.Tag()) return nil } return NotSupportedError(entity.Tag(), "mongo access") }
func startPingerIfAgent(clock clock.Clock, root *apiHandler, entity state.Entity) error { // worker runs presence.Pingers -- absence of which will cause // embarrassing "agent is lost" messages to show up in status -- // until it's stopped. It's stored in resources purely for the // side effects: we don't record its id, and nobody else // retrieves it -- we just expect it to be stopped when the // connection is shut down. agent, ok := entity.(statepresence.Agent) if !ok { return nil } worker, err := presence.New(presence.Config{ Identity: entity.Tag(), Start: presenceShim{agent}.Start, Clock: clock, RetryDelay: 3 * time.Second, }) if err != nil { return err } root.getResources().Register(worker) // pingTimeout, by contrast, *is* used by the Pinger facade to // stave off the call to action() that will shut down the agent // connection if it gets lackadaisical about sending keepalive // Pings. // // Do not confuse those (apiserver) Pings with those made by // presence.Pinger (which *do* happen as a result of the former, // but only as a relatively distant consequence). // // We should have picked better names... action := func() { logger.Debugf("closing connection due to ping timout") if err := root.getRpcConn().Close(); err != nil { logger.Errorf("error closing the RPC connection: %v", err) } } pingTimeout := newPingTimeout(action, clock, maxClientPingInterval) return root.getResources().RegisterNamed("pingTimeout", pingTimeout) }