@@ -45,7 +45,7 @@ func ReadLogs(appName string, workloadID string, verbose bool, socket *websocket
45
45
wrotePending := false
46
46
47
47
for true {
48
- allPods , err := config .Kubernetes .ListPodsByLabels (map [string ]string {
48
+ pods , err := config .Kubernetes .ListPodsByLabels (map [string ]string {
49
49
"appName" : appName ,
50
50
"workloadID" : workloadID ,
51
51
"userFacing" : "true" ,
@@ -55,34 +55,42 @@ func ReadLogs(appName string, workloadID string, verbose bool, socket *websocket
55
55
return
56
56
}
57
57
58
- // Prefer running API pods if any exist
59
- var pods []corev1. Pod
60
- for _ , pod := range allPods {
61
- if pod . Labels [ "workloadType" ] == WorkloadTypeAPI && k8s . GetPodStatus ( & pod ) != k8s . PodStatusRunning {
62
- continue
58
+ if len ( pods ) > 0 {
59
+ if len ( pods ) > 1 {
60
+ if ! writeSocket ( fmt . Sprintf ( "%d pods available, streaming logs for one of them:" , len ( pods )), socket ) {
61
+ return
62
+ }
63
63
}
64
- pods = append (pods , pod )
65
- }
66
- if len (pods ) == 0 {
67
- pods = allPods
68
- }
69
-
70
- if len (pods ) == 1 {
71
- getKubectlLogs (& pods [0 ], verbose , wrotePending , socket )
72
- return
73
- }
74
64
75
- if len (pods ) > 1 {
76
- if ! writeSocket (fmt .Sprintf ("%d pods available, streaming logs for one of them:" , len (pods )), socket ) {
77
- return
78
- }
65
+ podMap := make (map [k8s.PodStatus ][]corev1.Pod )
79
66
for _ , pod := range pods {
80
- if pod .Status .Phase != "Pending" {
81
- getKubectlLogs (& pod , verbose , wrotePending , socket )
82
- return
67
+ podMap [k8s .GetPodStatus (& pod )] = append (podMap [k8s .GetPodStatus (& pod )], pod )
68
+ }
69
+
70
+ switch {
71
+ case len (podMap [k8s .PodStatusSucceeded ]) > 0 :
72
+ getKubectlLogs (& podMap [k8s .PodStatusSucceeded ][0 ], verbose , wrotePending , false , socket )
73
+ case len (podMap [k8s .PodStatusRunning ]) > 0 :
74
+ getKubectlLogs (& podMap [k8s .PodStatusRunning ][0 ], verbose , wrotePending , false , socket )
75
+ case len (podMap [k8s .PodStatusPending ]) > 0 :
76
+ getKubectlLogs (& podMap [k8s .PodStatusPending ][0 ], verbose , wrotePending , false , socket )
77
+ case len (podMap [k8s .PodStatusKilled ]) > 0 :
78
+ getKubectlLogs (& podMap [k8s .PodStatusKilled ][0 ], verbose , wrotePending , false , socket )
79
+ case len (podMap [k8s .PodStatusKilledOOM ]) > 0 :
80
+ getKubectlLogs (& podMap [k8s .PodStatusKilledOOM ][0 ], verbose , wrotePending , false , socket )
81
+ case len (podMap [k8s .PodStatusFailed ]) > 0 :
82
+ previous := false
83
+ if pods [0 ].Labels ["workloadType" ] == WorkloadTypeAPI {
84
+ previous = true
83
85
}
86
+ getKubectlLogs (& podMap [k8s .PodStatusFailed ][0 ], verbose , wrotePending , previous , socket )
87
+ case len (podMap [k8s .PodStatusTerminating ]) > 0 :
88
+ getKubectlLogs (& podMap [k8s .PodStatusTerminating ][0 ], verbose , wrotePending , false , socket )
89
+ case len (podMap [k8s .PodStatusUnknown ]) > 0 :
90
+ getKubectlLogs (& podMap [k8s .PodStatusUnknown ][0 ], verbose , wrotePending , false , socket )
91
+ default : // unexpected
92
+ getKubectlLogs (& pods [0 ], verbose , wrotePending , false , socket )
84
93
}
85
- getKubectlLogs (& pods [0 ], verbose , wrotePending , socket )
86
94
return
87
95
}
88
96
@@ -110,7 +118,7 @@ func ReadLogs(appName string, workloadID string, verbose bool, socket *websocket
110
118
if ! writeSocket ("\n Failed to start:\n " , socket ) {
111
119
return
112
120
}
113
- getKubectlLogs (failedArgoPod , true , false , socket )
121
+ getKubectlLogs (failedArgoPod , true , false , false , socket )
114
122
return
115
123
}
116
124
@@ -125,10 +133,10 @@ func ReadLogs(appName string, workloadID string, verbose bool, socket *websocket
125
133
}
126
134
}
127
135
128
- func getKubectlLogs (pod * corev1.Pod , verbose bool , wrotePending bool , socket * websocket.Conn ) {
136
+ func getKubectlLogs (pod * corev1.Pod , verbose bool , wrotePending bool , previous bool , socket * websocket.Conn ) {
129
137
cmdPath := "/usr/local/bin/kubectl"
130
138
131
- if pod . Status . Phase == "Pending" {
139
+ if k8s . GetPodStatus ( pod ) == k8s . PodStatusPending {
132
140
if ! wrotePending {
133
141
if ! writeSocket ("\n Pending" , socket ) {
134
142
return
@@ -137,9 +145,14 @@ func getKubectlLogs(pod *corev1.Pod, verbose bool, wrotePending bool, socket *we
137
145
config .Kubernetes .WaitForPodRunning (pod .Name , 1 )
138
146
}
139
147
140
- args := []string {"kubectl" , "-n=" + config .Cortex .Namespace , "logs" , "--follow=true" , pod .Name }
148
+ args := []string {"kubectl" , "-n=" + config .Cortex .Namespace , "logs" , "--follow=true" }
149
+ if previous {
150
+ args = append (args , "--previous" )
151
+ }
152
+
153
+ args = append (args , pod .Name )
141
154
if pod .Labels ["workloadType" ] == WorkloadTypeAPI && pod .Labels ["userFacing" ] == "true" {
142
- args = [] string { "kubectl" , "-n=" + config . Cortex . Namespace , "logs" , "--follow=true" , pod . Name , apiContainerName }
155
+ args = append ( args , apiContainerName )
143
156
}
144
157
145
158
outr , outw , err := os .Pipe ()
0 commit comments