in cmd/minikube/cmd/status.go [506:633]
func clusterState(sts []*Status) ClusterState {
statusName := sts[0].APIServer
if sts[0].Host == codeNames[InsufficientStorage] {
statusName = sts[0].Host
}
sc := statusCode(statusName)
cs := ClusterState{
BinaryVersion: version.GetVersion(),
BaseState: BaseState{
Name: ClusterFlagValue(),
StatusCode: sc,
StatusName: statusName,
StatusDetail: codeDetails[sc],
},
TimeToStop: sts[0].TimeToStop,
Components: map[string]BaseState{
"kubeconfig": {Name: "kubeconfig", StatusCode: statusCode(sts[0].Kubeconfig), StatusName: codeNames[statusCode(sts[0].Kubeconfig)]},
},
}
for _, st := range sts {
ns := NodeState{
BaseState: BaseState{
Name: st.Name,
StatusCode: statusCode(st.Host),
},
Components: map[string]BaseState{
"kubelet": {Name: "kubelet", StatusCode: statusCode(st.Kubelet)},
},
}
if st.APIServer != Irrelevant {
ns.Components["apiserver"] = BaseState{Name: "apiserver", StatusCode: statusCode(st.APIServer)}
}
// Convert status codes to status names
ns.StatusName = codeNames[ns.StatusCode]
for k, v := range ns.Components {
v.StatusName = codeNames[v.StatusCode]
ns.Components[k] = v
}
cs.Nodes = append(cs.Nodes, ns)
}
evs, mtime, err := readEventLog(sts[0].Name)
if err != nil {
klog.Errorf("unable to read event log: %v", err)
return cs
}
transientCode := 0
var finalStep map[string]string
for _, ev := range evs {
// klog.Infof("read event: %+v", ev)
if ev.Type() == "io.k8s.sigs.minikube.step" {
var data map[string]string
err := ev.DataAs(&data)
if err != nil {
klog.Errorf("unable to parse data: %v\nraw data: %s", err, ev.Data())
continue
}
switch data["name"] {
case string(register.InitialSetup):
transientCode = Starting
case string(register.Done):
transientCode = 0
case string(register.Stopping):
klog.Infof("%q == %q", data["name"], register.Stopping)
transientCode = Stopping
case string(register.Deleting):
transientCode = Deleting
case string(register.Pausing):
transientCode = Pausing
case string(register.Unpausing):
transientCode = Unpausing
}
finalStep = data
klog.Infof("transient code %d (%q) for step: %+v", transientCode, codeNames[transientCode], data)
}
if ev.Type() == "io.k8s.sigs.minikube.error" {
var data map[string]string
err := ev.DataAs(&data)
if err != nil {
klog.Errorf("unable to parse data: %v\nraw data: %s", err, ev.Data())
continue
}
exitCode, err := strconv.Atoi(data["exitcode"])
if err != nil {
klog.Errorf("exit code not found: %v", err)
continue
}
if val, ok := exitCodeToHTTPCode[exitCode]; ok {
exitCode = val
}
transientCode = exitCode
for _, n := range cs.Nodes {
n.StatusCode = transientCode
n.StatusName = codeNames[n.StatusCode]
}
klog.Infof("transient code %d (%q) for step: %+v", transientCode, codeNames[transientCode], data)
}
}
if finalStep != nil {
if mtime.Before(time.Now().Add(-10 * time.Minute)) {
klog.Warningf("event stream is too old (%s) to be considered a transient state", mtime)
} else {
cs.Step = strings.TrimSpace(finalStep["name"])
cs.StepDetail = strings.TrimSpace(finalStep["message"])
if transientCode != 0 {
cs.StatusCode = transientCode
}
}
}
cs.StatusName = codeNames[cs.StatusCode]
cs.StatusDetail = codeDetails[cs.StatusCode]
return cs
}