github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/common/machinestatus.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package common 5 6 import ( 7 "github.com/juju/juju/core/status" 8 "github.com/juju/juju/state" 9 ) 10 11 // MachineStatusGetter defines the machine functionality 12 // required to status. 13 type MachineStatusGetter interface { 14 Status() (status.StatusInfo, error) 15 AgentPresence() (bool, error) 16 Id() string 17 Life() state.Life 18 } 19 20 // MachineStatus returns the machine agent status for a given 21 // machine, with special handling for agent presence. 22 func (c *ModelPresenceContext) MachineStatus(machine MachineStatusGetter) (status.StatusInfo, error) { 23 machineStatus, err := machine.Status() 24 if err != nil { 25 return status.StatusInfo{}, err 26 } 27 28 if !canMachineBeDown(machineStatus) { 29 // The machine still being provisioned - there's no point in 30 // enquiring about the agent liveness. 31 return machineStatus, nil 32 } 33 34 agentAlive, err := c.machinePresence(machine) 35 if err != nil { 36 // We don't want any presence errors affecting status. 37 logger.Debugf("error determining presence for machine %s: %v", machine.Id(), err) 38 return machineStatus, nil 39 } 40 if machine.Life() != state.Dead && !agentAlive { 41 machineStatus.Status = status.Down 42 machineStatus.Message = "agent is not communicating with the server" 43 } 44 return machineStatus, nil 45 } 46 47 func canMachineBeDown(machineStatus status.StatusInfo) bool { 48 switch machineStatus.Status { 49 case status.Pending, status.Stopped: 50 return false 51 } 52 return true 53 }