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  }