github.com/rancher/types@v0.0.0-20220328215343-4370ff10ecd5/mapper/container_status.go (about) 1 package mapper 2 3 import ( 4 "fmt" 5 6 "github.com/rancher/norman/types" 7 "github.com/rancher/norman/types/convert" 8 "github.com/rancher/norman/types/values" 9 ) 10 11 type ContainerStatus struct { 12 } 13 14 type containerState struct { 15 state string 16 message string 17 transitioning string 18 exitCode interface{} 19 restartCount int64 20 } 21 22 func message(m map[string]interface{}) string { 23 if m["message"] == nil { 24 return convert.ToString(m["reason"]) 25 } 26 return fmt.Sprintf("%s: %s", m["reason"], m["message"]) 27 } 28 29 func checkStatus(containerStates map[string]containerState, containerStatus []map[string]interface{}) { 30 for _, status := range containerStatus { 31 name := convert.ToString(status["name"]) 32 restartCount, _ := convert.ToNumber(status["restartCount"]) 33 s := containerState{ 34 state: "pending", 35 restartCount: restartCount, 36 transitioning: "no", 37 } 38 for k, v := range convert.ToMapInterface(status["state"]) { 39 m := convert.ToMapInterface(v) 40 switch k { 41 case "terminated": 42 s.state = "terminated" 43 s.message = message(m) 44 s.exitCode = m["exitCode"] 45 if convert.ToString(s.exitCode) == "0" { 46 s.transitioning = "no" 47 } else { 48 s.transitioning = "error" 49 } 50 case "running": 51 ready := convert.ToBool(status["ready"]) 52 if ready { 53 s.state = "running" 54 s.transitioning = "no" 55 } else { 56 s.state = "notready" 57 s.transitioning = "yes" 58 } 59 case "waiting": 60 s.state = "waiting" 61 s.transitioning = "yes" 62 s.message = message(m) 63 } 64 } 65 66 containerStates[name] = s 67 } 68 } 69 70 func (n ContainerStatus) FromInternal(data map[string]interface{}) { 71 containerStates := map[string]containerState{} 72 containerStatus := convert.ToMapSlice(values.GetValueN(data, "status", "containerStatuses")) 73 checkStatus(containerStates, containerStatus) 74 75 containerStatus = convert.ToMapSlice(values.GetValueN(data, "status", "initContainerStatuses")) 76 checkStatus(containerStates, containerStatus) 77 78 containers := append(convert.ToMapSlice(values.GetValueN(data, "containers")), 79 convert.ToMapSlice(values.GetValueN(data, "initContainers"))...) 80 for _, container := range containers { 81 if container == nil { 82 continue 83 } 84 85 name := convert.ToString(container["name"]) 86 state, ok := containerStates[name] 87 if ok { 88 container["state"] = state.state 89 container["transitioning"] = state.transitioning 90 container["transitioningMessage"] = state.message 91 container["restartCount"] = state.restartCount 92 container["exitCode"] = state.exitCode 93 } else { 94 container["state"] = "unknown" 95 } 96 } 97 } 98 99 func (n ContainerStatus) ToInternal(data map[string]interface{}) error { 100 return nil 101 } 102 103 func (n ContainerStatus) ModifySchema(schema *types.Schema, schemas *types.Schemas) error { 104 return nil 105 }