diff --git a/apis/project.cattle.io/v3/schema/schema.go b/apis/project.cattle.io/v3/schema/schema.go index 2429fea4..2b74df10 100644 --- a/apis/project.cattle.io/v3/schema/schema.go +++ b/apis/project.cattle.io/v3/schema/schema.go @@ -472,6 +472,7 @@ func podTypes(schemas *types.Schemas) *types.Schemas { &m.AnnotationField{Field: "description"}, &m.AnnotationField{Field: "publicEndpoints", List: true}, mapper.ContainerPorts{}, + mapper.ContainerStatus{}, ). // Must import handlers before Container MustImport(&Version, v1.ContainerPort{}, struct { @@ -489,9 +490,13 @@ func podTypes(schemas *types.Schemas) *types.Schemas { MustImport(&Version, v1.Handler{}, handlerOverride{}). MustImport(&Version, v1.Probe{}, handlerOverride{}). MustImport(&Version, v1.Container{}, struct { - Environment map[string]string - EnvironmentFrom []EnvironmentFrom - InitContainer bool + Environment map[string]string + EnvironmentFrom []EnvironmentFrom + InitContainer bool + State string + TransitioningMessage string + ExitCode *int + RestartCount int }{}). MustImport(&Version, v1.PodSpec{}, struct { Scheduling *Scheduling diff --git a/mapper/container_status.go b/mapper/container_status.go new file mode 100644 index 00000000..4a9ad42d --- /dev/null +++ b/mapper/container_status.go @@ -0,0 +1,73 @@ +package mapper + +import ( + "fmt" + + "github.com/rancher/norman/types" + "github.com/rancher/norman/types/convert" + "github.com/rancher/norman/types/values" +) + +type ContainerStatus struct { +} + +type containerState struct { + state string + message string + exitCode interface{} + restartCount int64 +} + +func (n ContainerStatus) FromInternal(data map[string]interface{}) { + containerStates := map[string]containerState{} + containerStatus := convert.ToMapSlice(values.GetValueN(data, "status", "containerStatuses")) + for _, status := range containerStatus { + name := convert.ToString(status["name"]) + restartCount, _ := convert.ToNumber(status["restartCount"]) + s := containerState{ + state: "pending", + restartCount: restartCount, + } + for k, v := range convert.ToMapInterface(status["state"]) { + m := convert.ToMapInterface(v) + switch k { + case "terminated": + s.state = "terminated" + s.message = fmt.Sprintf("%s: %s", m["reason"], m["message"]) + s.exitCode = m["exitCode"] + case "running": + s.state = "running" + case "waiting": + s.state = "waiting" + s.message = fmt.Sprintf("%s: %s", m["reason"], m["message"]) + } + } + + containerStates[name] = s + } + + containers := convert.ToMapSlice(values.GetValueN(data, "containers")) + for _, container := range containers { + if container == nil { + continue + } + + name := convert.ToString(container["name"]) + state, ok := containerStates[name] + if ok { + container["state"] = state.state + container["transitioningMessage"] = state.message + container["restartCount"] = state.restartCount + container["exitCode"] = state.exitCode + } else { + container["state"] = "unknown" + } + } +} + +func (n ContainerStatus) ToInternal(data map[string]interface{}) { +} + +func (n ContainerStatus) ModifySchema(schema *types.Schema, schemas *types.Schemas) error { + return nil +} diff --git a/status/status.go b/status/status.go index 8ca2e2f8..f62f2d4a 100644 --- a/status/status.go +++ b/status/status.go @@ -226,10 +226,12 @@ func genericStatus(data map[string]interface{}) { } } - if state == "" { - val, ok := values.GetValueN(data, "status", "phase").(string) - if val != "" && ok { - state = val + phase, ok := values.GetValueN(data, "status", "phase").(string) + if phase != "" && ok { + if phase == "Succeeded" { + state = "succeeded" + } else if state == "" { + state = phase } } @@ -260,7 +262,7 @@ func genericStatus(data map[string]interface{}) { data["state"] = strings.ToLower(state) data["transitioningMessage"] = message - val, ok := values.GetValue(data, "metadata", "removed") + val, ok = values.GetValue(data, "metadata", "removed") if ok && val != "" && val != nil { data["state"] = "removing" data["transitioning"] = "yes"