func (u update) countHealthy(id rcf.ID, checks map[string]health.Result) (rcNodeCounts, error) { ret := rcNodeCounts{} rcFields, err := u.rcs.Get(id) if err != nil { return ret, err } ret.Desired = rcFields.ReplicasDesired nodes, err := rc.New(rcFields, u.kps, u.rcs, u.sched, u.labeler, u.logger).CurrentNodes() if err != nil { return ret, err } ret.Current = len(nodes) for _, node := range nodes { // TODO: is reality checking an rc-layer concern? realManifest, _, err := u.kps.Pod(kp.RealityPath(node, rcFields.Manifest.ID())) if err != nil { return ret, err } realSHA, _ := realManifest.SHA() targetSHA, _ := rcFields.Manifest.SHA() if targetSHA == realSHA { ret.Real++ } else { // don't check health if the update isn't even done there yet continue } if hres, ok := checks[node]; ok && hres.Status == health.Passing { ret.Healthy++ } } return ret, err }
func (u *update) countHealthy(id rcf.ID, checks map[types.NodeName]health.Result) (rcNodeCounts, error) { ret := rcNodeCounts{} rcFields, err := u.rcs.Get(id) if rcstore.IsNotExist(err) { err := util.Errorf("RC %s did not exist", id) return ret, err } else if err != nil { return ret, err } ret.Desired = rcFields.ReplicasDesired currentPods, err := rc.New(rcFields, u.kps, u.rcs, u.sched, u.labeler, u.logger, u.alerter).CurrentPods() if err != nil { return ret, err } ret.Current = len(currentPods) if ret.Desired > ret.Current { // This implies that the RC hasn't yet scheduled pods that it desires to have. // We consider their health to be unknown in this case. // Note that the below loop over `range currentPods` may also increase `ret.Unknown`. ret.Unknown = ret.Desired - ret.Current } for _, pod := range currentPods { node := pod.Node // TODO: is reality checking an rc-layer concern? realManifest, _, err := u.kps.Pod(kp.REALITY_TREE, node, rcFields.Manifest.ID()) if err != nil && err != pods.NoCurrentManifest { return ret, err } // if realManifest is nil, we use an empty string for comparison purposes against rc // manifest SHA, which works for that purpose. var realSHA string if realManifest != nil { realSHA, _ = realManifest.SHA() } targetSHA, _ := rcFields.Manifest.SHA() if targetSHA == realSHA { ret.Real++ } else { // don't check health if the update isn't even done there yet continue } if hres, ok := checks[node]; ok { if hres.Status == health.Passing { ret.Healthy++ } else if hres.Status == health.Unknown { ret.Unknown++ } else { ret.Unhealthy++ } } else { ret.Unknown++ } } return ret, err }