@@ -45,7 +45,7 @@ func ReadLogs(appName string, workloadID string, verbose bool, socket *websocket
4545 wrotePending := false
4646
4747 for true {
48- allPods , err := config .Kubernetes .ListPodsByLabels (map [string ]string {
48+ pods , err := config .Kubernetes .ListPodsByLabels (map [string ]string {
4949 "appName" : appName ,
5050 "workloadID" : workloadID ,
5151 "userFacing" : "true" ,
@@ -55,34 +55,42 @@ func ReadLogs(appName string, workloadID string, verbose bool, socket *websocket
5555 return
5656 }
5757
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+ }
6363 }
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- }
7464
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 )
7966 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
8385 }
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 )
8493 }
85- getKubectlLogs (& pods [0 ], verbose , wrotePending , socket )
8694 return
8795 }
8896
@@ -110,7 +118,7 @@ func ReadLogs(appName string, workloadID string, verbose bool, socket *websocket
110118 if ! writeSocket ("\n Failed to start:\n " , socket ) {
111119 return
112120 }
113- getKubectlLogs (failedArgoPod , true , false , socket )
121+ getKubectlLogs (failedArgoPod , true , false , false , socket )
114122 return
115123 }
116124
@@ -125,10 +133,10 @@ func ReadLogs(appName string, workloadID string, verbose bool, socket *websocket
125133 }
126134}
127135
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 ) {
129137 cmdPath := "/usr/local/bin/kubectl"
130138
131- if pod . Status . Phase == "Pending" {
139+ if k8s . GetPodStatus ( pod ) == k8s . PodStatusPending {
132140 if ! wrotePending {
133141 if ! writeSocket ("\n Pending" , socket ) {
134142 return
@@ -137,9 +145,14 @@ func getKubectlLogs(pod *corev1.Pod, verbose bool, wrotePending bool, socket *we
137145 config .Kubernetes .WaitForPodRunning (pod .Name , 1 )
138146 }
139147
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 )
141154 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 )
143156 }
144157
145158 outr , outw , err := os .Pipe ()
0 commit comments