mirror of https://github.com/k3s-io/k3s
add readiness gates column in the wide printout for pod
parent
95014b2666
commit
c987e95282
|
@ -61,7 +61,7 @@ func TestHumanReadablePrinterSupportsExpectedOptions(t *testing.T) {
|
|||
{
|
||||
name: "\"wide\" output format prints",
|
||||
outputFormat: "wide",
|
||||
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\\ +IP\\ +NODE\\ +NOMINATED NODE\nfoo\\ +0/0\\ +0\\ +<unknown>\\ +<none>\\ +<none>\\ +<none>\n",
|
||||
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\\ +IP\\ +NODE\\ +NOMINATED NODE\\ +READINESS GATES\nfoo\\ +0/0\\ +0\\ +<unknown>\\ +<none>\\ +<none>\\ +<none>\\ +<none>\n",
|
||||
},
|
||||
{
|
||||
name: "no-headers prints output with no headers",
|
||||
|
@ -72,7 +72,7 @@ func TestHumanReadablePrinterSupportsExpectedOptions(t *testing.T) {
|
|||
name: "no-headers and a \"wide\" output format prints output with no headers and additional columns",
|
||||
outputFormat: "wide",
|
||||
noHeaders: true,
|
||||
expectedOutput: "foo\\ +0/0\\ +0\\ +<unknown>\\ +<none>\\ +<none>\\ +<none>\n",
|
||||
expectedOutput: "foo\\ +0/0\\ +0\\ +<unknown>\\ +<none>\\ +<none>\\ +<none>\\ +<none>\n",
|
||||
},
|
||||
{
|
||||
name: "show-kind displays the resource's kind, even when printing a single type of resource",
|
||||
|
|
|
@ -86,6 +86,7 @@ func AddHandlers(h printers.PrintHandler) {
|
|||
{Name: "IP", Type: "string", Priority: 1, Description: apiv1.PodStatus{}.SwaggerDoc()["podIP"]},
|
||||
{Name: "Node", Type: "string", Priority: 1, Description: apiv1.PodSpec{}.SwaggerDoc()["nodeName"]},
|
||||
{Name: "Nominated Node", Type: "string", Priority: 1, Description: apiv1.PodStatus{}.SwaggerDoc()["nominatedNodeName"]},
|
||||
{Name: "Readiness Gates", Type: "string", Priority: 1, Description: apiv1.PodSpec{}.SwaggerDoc()["readinessGates"]},
|
||||
}
|
||||
h.TableHandler(podColumnDefinitions, printPodList)
|
||||
h.TableHandler(podColumnDefinitions, printPod)
|
||||
|
@ -663,11 +664,11 @@ func printPod(pod *api.Pod, options printers.PrintOptions) ([]metav1beta1.TableR
|
|||
}
|
||||
|
||||
row.Cells = append(row.Cells, pod.Name, fmt.Sprintf("%d/%d", readyContainers, totalContainers), reason, int64(restarts), translateTimestampSince(pod.CreationTimestamp))
|
||||
|
||||
if options.Wide {
|
||||
nodeName := pod.Spec.NodeName
|
||||
nominatedNodeName := pod.Status.NominatedNodeName
|
||||
podIP := pod.Status.PodIP
|
||||
|
||||
if podIP == "" {
|
||||
podIP = "<none>"
|
||||
}
|
||||
|
@ -677,7 +678,24 @@ func printPod(pod *api.Pod, options printers.PrintOptions) ([]metav1beta1.TableR
|
|||
if nominatedNodeName == "" {
|
||||
nominatedNodeName = "<none>"
|
||||
}
|
||||
row.Cells = append(row.Cells, podIP, nodeName, nominatedNodeName)
|
||||
|
||||
readinessGates := "<none>"
|
||||
if len(pod.Spec.ReadinessGates) > 0 {
|
||||
trueConditions := 0
|
||||
for _, readinessGate := range pod.Spec.ReadinessGates {
|
||||
conditionType := readinessGate.ConditionType
|
||||
for _, condition := range pod.Status.Conditions {
|
||||
if condition.Type == conditionType {
|
||||
if condition.Status == api.ConditionTrue {
|
||||
trueConditions += 1
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
readinessGates = fmt.Sprintf("%d/%d", trueConditions, len(pod.Spec.ReadinessGates))
|
||||
}
|
||||
row.Cells = append(row.Cells, podIP, nodeName, nominatedNodeName, readinessGates)
|
||||
}
|
||||
|
||||
return []metav1beta1.TableRow{row}, nil
|
||||
|
|
|
@ -1649,6 +1649,9 @@ func TestPrintPod(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestPrintPodwide(t *testing.T) {
|
||||
condition1 := "condition1"
|
||||
condition2 := "condition2"
|
||||
condition3 := "condition3"
|
||||
tests := []struct {
|
||||
pod api.Pod
|
||||
expect []metav1beta1.TableRow
|
||||
|
@ -1660,8 +1663,29 @@ func TestPrintPodwide(t *testing.T) {
|
|||
Spec: api.PodSpec{
|
||||
Containers: make([]api.Container, 2),
|
||||
NodeName: "test1",
|
||||
ReadinessGates: []api.PodReadinessGate{
|
||||
{
|
||||
ConditionType: api.PodConditionType(condition1),
|
||||
},
|
||||
{
|
||||
ConditionType: api.PodConditionType(condition2),
|
||||
},
|
||||
{
|
||||
ConditionType: api.PodConditionType(condition3),
|
||||
},
|
||||
},
|
||||
},
|
||||
Status: api.PodStatus{
|
||||
Conditions: []api.PodCondition{
|
||||
{
|
||||
Type: api.PodConditionType(condition1),
|
||||
Status: api.ConditionFalse,
|
||||
},
|
||||
{
|
||||
Type: api.PodConditionType(condition2),
|
||||
Status: api.ConditionTrue,
|
||||
},
|
||||
},
|
||||
Phase: "podPhase",
|
||||
PodIP: "1.1.1.1",
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
|
@ -1671,7 +1695,7 @@ func TestPrintPodwide(t *testing.T) {
|
|||
NominatedNodeName: "node1",
|
||||
},
|
||||
},
|
||||
[]metav1beta1.TableRow{{Cells: []interface{}{"test1", "1/2", "podPhase", int64(6), "<unknown>", "1.1.1.1", "test1", "node1"}}},
|
||||
[]metav1beta1.TableRow{{Cells: []interface{}{"test1", "1/2", "podPhase", int64(6), "<unknown>", "1.1.1.1", "test1", "node1", "1/3"}}},
|
||||
},
|
||||
{
|
||||
// Test when the NodeName and PodIP are none
|
||||
|
@ -1690,7 +1714,7 @@ func TestPrintPodwide(t *testing.T) {
|
|||
},
|
||||
},
|
||||
},
|
||||
[]metav1beta1.TableRow{{Cells: []interface{}{"test2", "1/2", "ContainerWaitingReason", int64(6), "<unknown>", "<none>", "<none>", "<none>"}}},
|
||||
[]metav1beta1.TableRow{{Cells: []interface{}{"test2", "1/2", "ContainerWaitingReason", int64(6), "<unknown>", "<none>", "<none>", "<none>", "<none>"}}},
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -421,8 +421,11 @@ func TestConvertToTableList(t *testing.T) {
|
|||
{Name: "IP", Type: "string", Priority: 1, Description: v1.PodStatus{}.SwaggerDoc()["podIP"]},
|
||||
{Name: "Node", Type: "string", Priority: 1, Description: v1.PodSpec{}.SwaggerDoc()["nodeName"]},
|
||||
{Name: "Nominated Node", Type: "string", Priority: 1, Description: v1.PodStatus{}.SwaggerDoc()["nominatedNodeName"]},
|
||||
{Name: "Readiness Gates", Type: "string", Priority: 1, Description: v1.PodSpec{}.SwaggerDoc()["readinessGates"]},
|
||||
}
|
||||
|
||||
condition1 := "condition1"
|
||||
condition2 := "condition2"
|
||||
pod1 := &api.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{Namespace: "test", Name: "foo", CreationTimestamp: metav1.NewTime(time.Now().Add(-370 * 24 * time.Hour))},
|
||||
Spec: api.PodSpec{
|
||||
|
@ -431,8 +434,26 @@ func TestConvertToTableList(t *testing.T) {
|
|||
{Name: "ctr2", Ports: []api.ContainerPort{{ContainerPort: 9376}}},
|
||||
},
|
||||
NodeName: "test-node",
|
||||
ReadinessGates: []api.PodReadinessGate{
|
||||
{
|
||||
ConditionType: api.PodConditionType(condition1),
|
||||
},
|
||||
{
|
||||
ConditionType: api.PodConditionType(condition2),
|
||||
},
|
||||
},
|
||||
},
|
||||
Status: api.PodStatus{
|
||||
Conditions: []api.PodCondition{
|
||||
{
|
||||
Type: api.PodConditionType(condition1),
|
||||
Status: api.ConditionFalse,
|
||||
},
|
||||
{
|
||||
Type: api.PodConditionType(condition2),
|
||||
Status: api.ConditionTrue,
|
||||
},
|
||||
},
|
||||
PodIP: "10.1.2.3",
|
||||
Phase: api.PodPending,
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
|
@ -457,7 +478,7 @@ func TestConvertToTableList(t *testing.T) {
|
|||
out: &metav1beta1.Table{
|
||||
ColumnDefinitions: columns,
|
||||
Rows: []metav1beta1.TableRow{
|
||||
{Cells: []interface{}{"", "0/0", "", int64(0), "<unknown>", "<none>", "<none>", "<none>"}, Object: runtime.RawExtension{Object: &api.Pod{}}},
|
||||
{Cells: []interface{}{"", "0/0", "", int64(0), "<unknown>", "<none>", "<none>", "<none>", "<none>"}, Object: runtime.RawExtension{Object: &api.Pod{}}},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -466,7 +487,7 @@ func TestConvertToTableList(t *testing.T) {
|
|||
out: &metav1beta1.Table{
|
||||
ColumnDefinitions: columns,
|
||||
Rows: []metav1beta1.TableRow{
|
||||
{Cells: []interface{}{"foo", "1/2", "Pending", int64(10), "370d", "10.1.2.3", "test-node", "nominated-node"}, Object: runtime.RawExtension{Object: pod1}},
|
||||
{Cells: []interface{}{"foo", "1/2", "Pending", int64(10), "370d", "10.1.2.3", "test-node", "nominated-node", "1/2"}, Object: runtime.RawExtension{Object: pod1}},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue