From b91e21f29fa00232a00d1fd81969e43e032045cd Mon Sep 17 00:00:00 2001 From: Frostebite Date: Mon, 18 Sep 2023 19:21:44 +0100 Subject: [PATCH] k8s reliable log hashing --- dist/index.js | Bin 19471478 -> 19481493 bytes dist/index.js.map | Bin 13772749 -> 13784907 bytes dist/licenses.txt | Bin 305142 -> 310906 bytes package.json | 1 + .../providers/k8s/kubernetes-task-runner.ts | 44 ++---------------- .../remote-client/remote-client-logger.ts | 26 +++++++++++ .../tests/e2e/remote-client.test.ts | 25 ++++++++++ yarn.lock | 24 ++++++++++ 8 files changed, 80 insertions(+), 40 deletions(-) create mode 100644 src/model/cloud-runner/tests/e2e/remote-client.test.ts diff --git a/dist/index.js b/dist/index.js index 263442e568b7c5766d8f121c7b4aab8fd1e3e3f1..9eac6a46520859ba7a490b4c642ad49fc6db0057 100644 GIT binary patch delta 11401 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 YSxL<*YF1OThMJbD3kT!Ds%hW*Z}~o1C;$Ke delta 2694 zcmcK4c~n$o7{~E5mlh7yDSQ*Y?8SUE@>I5<(8%*&InhWfEk)QXo;kiMQS3% z@|GHq{)HTbdx0z>j_p@u3#i;-CZObZR(@t}sX&^h#5QbAq+PcZh6hlC^J+8F%rbdgQ znkl$?W1TVaq7NXfj@nRByw4Cjv}wc6=31z(mJ`mg>Z-1}daIPMuq4lB&sUR@n(CP( z2dTwYr?rS$ImNMUN|(CnW-nnW_w`I0Zgt68+O;{V{5Ro(dlIAa)sSlc8e?_iBG0Hi zo{FisfHjiq+giPPu9BCz<<7R53f@88bVmMrD}Ry zY0H+}!PSbYYCR-S(9DOH=dA~tQQyB zTnUybswHu1>a?;cO+EJimh!kM^t`KXIzyw z)fr=ma4c4Q-2GQ5^XH1%gGzwAG1TLLxwq3DJ%gd+lxh=Ph}#2^-N=#CzUM*}yB+B@RjbR7?yo^D>LA=l_urdlFR#qG56f{s9>9Zm2rIA>tFRgmV-42g5v;>{ zJc`HgIG(@;Jc*~U5u5NdHe(B(!Lx9q9?#)oL|jW~v%@e7XQ1Ww{t{D$9g3a9Z0{={E6v!pV|unaO386Gl>GE6c&Wq8T( zmSL9RBg0ol2N@k@bdupG!(T>#jLtFwWpt6zRYs7EU>PAYLS=N55hf#CMudz=8BsD+ b8PPIgWW>sdlhIv94;k@>hRU1-gX!?!3X?^y diff --git a/dist/index.js.map b/dist/index.js.map index 18de8a862133603b9da254c7d35c8dea6b88445f..79e0807e2ba378ddcd64518fe2e66107b6ee9f0d 100644 GIT binary patch delta 11754 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 delta 2404 zcmbW%X;4#F6bJB$gn$WKAV~6Zfd`_X6~qlu3Zh~wZcRneDrzD;GztNepcSOWS_4(9 z(%2kp>sD>uZ9wG-D&ms5FKuVk@k{Mk+iB~xb~>H0)9FnAFGLz#zVyRy5^~SI@7#0F zhf!9f|%!>D}k-AECWXhCd@ZyhpQJk!z*jsrFp- zRmxSU?^1_GHjOHO?0HqhpEYfCQx+kYO=w(lSz6AMb~!w1hbPkEiE?-}4o|eh)63zB zY4K=dhKPlawQE%(lj~YzL=DrKRrN=cb-;mMJethLDQQcKKAcR0*@G~f*-|V_GnWf| zHg7c2up#U&8UD&tM4N2(sY0<}UMiGK7Hl@t0x5z{=doyAncteU)n+%9SMoW0IyG^e zX8I`JSX5-0gdl!W#RC4x?xMt`8v8=CEzN(sZ?U#0k$=u=*WtBB@6qy+QjR-=V&f?N z78g$=hqA|!cvezPw=>DIn{lqaoZOpkjQ?8KiF^*ZSL=0@KAa`xN~v0Xm*wqUH(F-0 z@ixIefJcqWs!Gh31$=6%w_vGK5MODsn#u*cV5Ni>E{4)eUza=mHewpcmk4`biQ}rX5?u}Y-iZdQu+&^pW#h{*YvsO4Ev=}slwhKY zr907}8+t7nR#pen#{3Mqt~2I2mnXH3Y3QaRwl8&rapBZ2iwzusCQ1!JJEV^^^xP(- z7=1^l*?rwg>6d1!EHm3vjI(%SzuDE7?U&Xb)wb112Dvo4g5pJ5?%y^1Ml-#3gC8yez<%IR<_ zr>al7!yp#oARc%~fJEpGNze!SLNcU4Kj;rH!2n2wG#Ci!FbD?25Eu%>AOnU&CX9fQ zkOeP8Hsru4$c51`2F5}jjDuI;RTvNXFaajQB$y0S;59J7>o64xU>Zz^LYM(F;SHDt zv!Mv)z+9LIMlivAD25UcpcEFsLNLQ3SPW%Q4i>0@N>~C`uz?+_U@0tvH(@zcLk+Be zT6hcIhB{aY@4zZ}7gmD<>Y)MNgEg=g*1`L*9yY*6XoL^I37gA4McEC>f6n4RG_zXUWJ+N0yy0dTm4`e=ZK1_UcW`Dv#*M;N(G|{?6PmfFYtLug8 z18@)y!D0A96sp~~&r_xw1+Ub!GzH)Mk`j=l#Pt0RjAGO0_b@w6|8Rksmq~|fdZHtv$#jMN zOx%oG(+zu>{iipHvgkAGacNE0*JJT#;!>F2D9U0!-L8+BZ+b&J3p+^Ulpc$rjFy65 zYGz4BYLNnvP{>QnO;vC%sw^nU*YygXuBgvq2vQj@#v(JF|16Wx^agzv1(3)BeU{Ye z^A0jCnr=UV*DAe%ynhi5R?^gv%G zd$#0^{PMh_?H@ifvoLRG+{kFB$eIkYZ=?pucKb_=>vypwm8PYo7ELc~X4cxS`JGve zW&7(Mri%qkDW>3nv4W-)U0`xCLQO7uT+aCgl|`B986^ss=|zug`aTCn@u8Vm+IRnD L+P?cQv-K(f9+d$Y delta 50 zcmV-20L}mU{1W!h5`eS;`K<(RcW!dGAw>cM1Ggf#0Y4$Pf!+bHy0>|q0?u%UKokSF IKokTzs!4(r`2YX_ diff --git a/package.json b/package.json index a7a4f9d9..4cee0820 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "commander": "^9.0.0", "commander-ts": "^0.2.0", "kubernetes-client": "^9.0.0", + "md5": "^2.3.0", "nanoid": "^3.3.1", "reflect-metadata": "^0.1.13", "semver": "^7.5.2", diff --git a/src/model/cloud-runner/providers/k8s/kubernetes-task-runner.ts b/src/model/cloud-runner/providers/k8s/kubernetes-task-runner.ts index ff2f39da..b1e1c3f5 100644 --- a/src/model/cloud-runner/providers/k8s/kubernetes-task-runner.ts +++ b/src/model/cloud-runner/providers/k8s/kubernetes-task-runner.ts @@ -5,11 +5,10 @@ import { CloudRunnerSystem } from '../../services/core/cloud-runner-system'; import CloudRunner from '../../cloud-runner'; import KubernetesPods from './kubernetes-pods'; import { FollowLogStreamService } from '../../services/core/follow-log-stream-service'; +import { RemoteClientLogger } from '../../remote-client/remote-client-logger'; class KubernetesTaskRunner { - static lastReceivedTimestamp: number = 0; static readonly maxRetry: number = 3; - static lastReceivedMessage: string = ``; static async runTask( kubeConfig: KubeConfig, kubeClient: CoreV1Api, @@ -21,30 +20,17 @@ class KubernetesTaskRunner { let output = ''; let shouldReadLogs = true; let shouldCleanup = true; - let sinceTime = ``; let retriesAfterFinish = 0; // eslint-disable-next-line no-constant-condition while (true) { await new Promise((resolve) => setTimeout(resolve, 3000)); - const lastReceivedMessage = - KubernetesTaskRunner.lastReceivedTimestamp > 0 - ? `\nLast Log Message "${this.lastReceivedMessage}" ${this.lastReceivedTimestamp}` - : ``; CloudRunnerLogger.log( - `Streaming logs from pod: ${podName} container: ${containerName} namespace: ${namespace} ${CloudRunner.buildParameters.kubeVolumeSize}/${CloudRunner.buildParameters.containerCpu}/${CloudRunner.buildParameters.containerMemory}\n${lastReceivedMessage}`, + `Streaming logs from pod: ${podName} container: ${containerName} namespace: ${namespace} ${CloudRunner.buildParameters.kubeVolumeSize}/${CloudRunner.buildParameters.containerCpu}/${CloudRunner.buildParameters.containerMemory}`, ); - if (KubernetesTaskRunner.lastReceivedTimestamp > 0) { - CloudRunnerLogger.log(`Last received timestamp was set, including --since-time parameter`); - const currentDate = new Date(KubernetesTaskRunner.lastReceivedTimestamp); - const dateTimeIsoString = currentDate.toISOString(); - sinceTime = ` --since-time="${dateTimeIsoString}"`; - } let extraFlags = ``; extraFlags += (await KubernetesPods.IsPodRunning(podName, namespace, kubeClient)) ? ` -f -c ${containerName}` : ` --previous`; - let lastMessageSeenIncludedInChunk = false; - let lastMessageSeen = false; let logs; const callback = (outputChunk: string) => { @@ -56,12 +42,7 @@ class KubernetesTaskRunner { } }; try { - logs = await CloudRunnerSystem.Run( - `kubectl logs ${podName}${extraFlags} --timestamps${sinceTime}`, - false, - true, - callback, - ); + logs = await CloudRunnerSystem.Run(`kubectl logs ${podName}${extraFlags}`, false, true, callback); } catch (error: any) { await new Promise((resolve) => setTimeout(resolve, 3000)); const continueStreaming = await KubernetesPods.IsPodRunning(podName, namespace, kubeClient); @@ -78,31 +59,14 @@ class KubernetesTaskRunner { } const splitLogs = logs.split(`\n`); for (const chunk of splitLogs) { - if ( - chunk.replace(/\s/g, ``) === KubernetesTaskRunner.lastReceivedMessage.replace(/\s/g, ``) && - KubernetesTaskRunner.lastReceivedMessage.replace(/\s/g, ``) !== `` - ) { - CloudRunnerLogger.log(`Previous log message found ${chunk}`); - lastMessageSeenIncludedInChunk = true; - } - } - for (const chunk of splitLogs) { - const newDate = Date.parse(`${chunk.toString().split(`Z `)[0]}Z`); - if (chunk.replace(/\s/g, ``) === KubernetesTaskRunner.lastReceivedMessage.replace(/\s/g, ``)) { - lastMessageSeen = true; - } - if (lastMessageSeenIncludedInChunk && !lastMessageSeen) { - continue; - } const message = CloudRunner.buildParameters.cloudRunnerDebug ? chunk : chunk.split(`Z `)[1]; - KubernetesTaskRunner.lastReceivedMessage = chunk; - KubernetesTaskRunner.lastReceivedTimestamp = newDate; ({ shouldReadLogs, shouldCleanup, output } = FollowLogStreamService.handleIteration( message, shouldReadLogs, shouldCleanup, output, )); + FollowLogStreamService.DidReceiveEndOfTransmission = RemoteClientLogger.HandleLogChunkLine(message); } if (FollowLogStreamService.DidReceiveEndOfTransmission) { CloudRunnerLogger.log('end of log stream'); diff --git a/src/model/cloud-runner/remote-client/remote-client-logger.ts b/src/model/cloud-runner/remote-client/remote-client-logger.ts index 7a33150d..8d4e60ab 100644 --- a/src/model/cloud-runner/remote-client/remote-client-logger.ts +++ b/src/model/cloud-runner/remote-client/remote-client-logger.ts @@ -5,6 +5,7 @@ import CloudRunner from '../cloud-runner'; import CloudRunnerOptions from '../options/cloud-runner-options'; import { CloudRunnerSystem } from '../services/core/cloud-runner-system'; import { CloudRunnerFolders } from '../options/cloud-runner-folders'; +const md5 = require('md5'); export class RemoteClientLogger { private static get LogFilePath() { @@ -71,4 +72,29 @@ export class RemoteClientLogger { await new Promise((resolve) => setTimeout(resolve, 15000)); } } + public static HandleLogChunkLine(message: string): boolean { + if (message.includes('LOGHASH: ')) { + RemoteClientLogger.md5 = message.split(`LOGHASH: `)[1]; + CloudRunnerLogger.log(`LOGHASH: ${RemoteClientLogger.md5}`); + } else { + if (RemoteClientLogger.value !== '') { + RemoteClientLogger.value += `\n`; + } + + RemoteClientLogger.value += message; + const hashedValue = md5(RemoteClientLogger.value); + CloudRunnerLogger.log( + `LOG ITERATION \n message:${message} \n target hash:${RemoteClientLogger.md5} \n hash latest value:${hashedValue} \n cache value:${RemoteClientLogger.value}`, + ); + if (RemoteClientLogger.md5 === hashedValue) { + CloudRunnerLogger.log(`LOG COMPLETE`); + + return true; + } + } + + return false; + } + static value: string = ''; + static md5: any; } diff --git a/src/model/cloud-runner/tests/e2e/remote-client.test.ts b/src/model/cloud-runner/tests/e2e/remote-client.test.ts new file mode 100644 index 00000000..779e9f7f --- /dev/null +++ b/src/model/cloud-runner/tests/e2e/remote-client.test.ts @@ -0,0 +1,25 @@ +import { RemoteClientLogger } from '../../remote-client/remote-client-logger'; +import setups from '../cloud-runner-suite.test'; +const md5 = require('md5'); + +describe('Cloud Runner Remote Client', () => { + it('Responds', () => {}); + setups(); + it('Run one build it using K8s without error', async () => { + const testLogStream = 'Test \n Log \n Stream'; + + const splitLogStream = testLogStream.split('\n'); + RemoteClientLogger.HandleLogChunkLine(`LOGHASH: ${md5(testLogStream)}`); + let completed = false; + for (const element of splitLogStream) { + completed = RemoteClientLogger.HandleLogChunkLine(element); + } + expect(completed).toBeTruthy(); + }, 1_000_000_000); + // eslint-disable-next-line unicorn/consistent-function-scoping, no-unused-vars + function CreateLogWatcher(callback: (finalMessage: string) => void) { + return (message: string) => { + callback(message); + }; + } +}); diff --git a/yarn.lock b/yarn.lock index 61ac1d04..f7911b7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1972,6 +1972,11 @@ char-regex@^1.0.2: resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +charenc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" @@ -2155,6 +2160,11 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypt@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + cssom@^0.4.4: version "0.4.4" resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" @@ -3301,6 +3311,11 @@ is-boolean-object@^1.1.0: dependencies: call-bind "^1.0.0" +is-buffer@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz" @@ -4224,6 +4239,15 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" +md5@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== + dependencies: + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"