🌳
pt0/deployF/k8sF/kubeCliActionsF/logsRetryAI.mts
1import * as _ from 'lodash-es'
4const fullSuffixCmd = ` ; echo finexit123 > /dev/null; exit`
6type LogsRetryProps = { kubeConfigPath: string, cmdA: string[], noOutCmd?: boolean }
8export const runLogsWithRetry = async ({ kubeConfigPath, cmdA, noOutCmd }: LogsRetryProps) => {
9 let prevstdouterr: string | undefined
10 let isRetrySilencedOutput = false
11 let shouldRetry = true
13 while (shouldRetry) {
14 shouldRetry = false
15 const cmd = _.chain([
16 `KUBECONFIG=${kubeConfigPath}`,
17 ...cmdA,
18 prevstdouterr && '--tail=0',
19 ]).compact().join(' ').value()
21 let silData = ''
22 const onDataFnc = (data: string) => {
23 if (
24 _.includes(data, 'INTERNAL_ERROR; received from peer') ||
25 _.includes(data, 'read: connection reset by peer')
26 ) {
27 shouldRetry = true
28 isRetrySilencedOutput = true
29 }
30 if (isRetrySilencedOutput) {
31 silData += data
32 const silenceEndI = silData.indexOf(fullSuffixCmd)
33 if (silenceEndI == -1) {
34 return ''
35 } else {
36 isRetrySilencedOutput = false
37 silData = silData.slice(silenceEndI + fullSuffixCmd.length)
38 silData = ''
39 }
40 }
41 return _.chain(data).split("\n").map((line) => {
42 const doesIncl = _.chain([
43 cmd,
44 `couldn't get resource list for custom.metrics.k8s.io/v1beta1`,
45 ]).find((str) => _.includes(line, str)).value()
46 if (doesIncl) return null
47 return line
48 }).reject((line) => line === null).join("\n").value()
49 }
51 const rett = await livePtySpawn({
52 cmd, onDataFnc,
53 noOutCmd: noOutCmd || shouldRetry,
54 ...prevstdouterr ? {prevstdouterr} : {},
55 } as any)
56 prevstdouterr = rett.stdout + (rett.stderr || '')
57 if (shouldRetry) {
58 isRetrySilencedOutput = true
59 }
60 }
61 return {stdout: prevstdouterr || ''}