From 2019e730cbfcf757e2bf9df21ee803bfb14149a2 Mon Sep 17 00:00:00 2001 From: Frostebite Date: Mon, 14 Aug 2023 18:59:05 +0100 Subject: [PATCH] podname logs for log service --- dist/index.js | Bin 19472961 -> 19465861 bytes dist/index.js.map | Bin 13774191 -> 13765728 bytes src/model/cloud-runner/providers/k8s/index.ts | 5 - .../providers/k8s/kubernetes-log-service.ts | 158 ------------------ src/model/cloud-runner/remote-client/index.ts | 2 +- .../remote-client/remote-client-logger.ts | 13 +- .../tests/cloud-runner-kubernetes.test.ts | 82 --------- 7 files changed, 10 insertions(+), 250 deletions(-) delete mode 100644 src/model/cloud-runner/providers/k8s/kubernetes-log-service.ts delete mode 100644 src/model/cloud-runner/tests/cloud-runner-kubernetes.test.ts diff --git a/dist/index.js b/dist/index.js index 1d3dcd24c1a34186056f7eb35fcf2309748dd0d5..ee958f34940fa32af7765763f15296738e143eda 100644 GIT binary patch delta 1556 zcmZwHX;f5Y7{Kv!?;Qqa9QI*%xiE+k8d*Yx$zY3>0nus;6=PgyP?(F%sHtUE5UIJ6 zyzNoZZkA?_t!8PKw$Nsq8CkZNB`s>J`G3yoV;_G1^FHS}=lS?<+T82vSlsKH->$9G zJF?W&9r~D9e71fdP1TLmeX*@2dS{aAFNup+=4z)iwyQ!fH`J;ky+{rCG+%6IrQV(w zI~>*bcISoy;l^gG+78wP!hxXGVuho1b|gB{p4^q%kgi&{yHeCZpPry573x{aZgeE7 zhGK^!R^u@ij#5=yjJTB>43C=UH=MEJ3ZvFgOWc~%`+o;j?OMlpwQZa+-D8I%Q8N^X zgsjGDwY<`p>;7-BgAui6eP+5^QE4m~U0P~3+jgrt#cngp%$BBbggF>&3J1+-$dY%& zv}Rguvt>6UYPnT^i=$90>kg|7Rh6$fy80TN$}IJGRmz-MIa;~unWlSH&jhVNdHhDQ z+ULwo=vtQQ>a6!0a3BsKQ+b7K%ZNJJ8nk%CmDAst?1AQM^0Mh@DV=7C-@YfVJAMvE_{K0e2Lxo3SVOnzQMQn4&P%he!xEb zh@Y?@1Na%g;8*;H12~97_#J=XPyB_y@edB;-$nI)Z7C$W#E>{7aT2E_UXmbjN!*e_ z5|1QNk|ar%q)1XFX_9n_SCS#glw?V=B{`B@NuFe|WQb&_WSGR1bs!U5gg z6OtueZdLj&k=1}QG$04{3R+ghiVGL1s#eYQe!u1xtuzJv_^z^&Uw0kv>Z0W@XWJuV zXB?yBRqUqJh-Z(5_&k<;!N>FxkfmT)Jx@0#(G9JsVmxBI!$imLO|p)5&t-Fsk?LL6 z|Fg*g>L_RBq|Rq^M$gP+TE0ol8lAXshkexZr0JkBGWN(ZI;k;l#4^-D<4>^!Qg*On z!fd7)kt}sJ7_+FYgC!(Q4S=LwW!bc2Ewj#;n4#F@kf&sOCcV$^Nl9(J;Hyn*G@$i6uV85PccT~}Sb{(vkVuN-pH6+Tvw zH9hB|8$7Q7o+6!o$(dPjZk1{tlm=u?m3ksa2l8p*tHy*xrEg_)xlm^ZbBKhqY5r?u}cPl?_u> zrdxGOs=r+hX?`Wh8@W@$T-9vwIwy+G5k16}UFQ$_M5*aUV+G^O(Y!D#Nk8|gn3k{# zDzw-VGVA#{-&WJ^oPy##@0w=Cb*HIv54szkN?UZJ;X(G$`nk3oIyv8LHn&RMa)3@h znvxf7JmcKP>GYL*?6moV;+b^&dYh$G4fuN`t)6?UKise$!cOiRs^`O-=-3igMQ=By z7er3YGEv47Hj|F~lN0}Y7bD(kGmWog8B~06W+t6of;D>lh3q71UdkHM`~y;-jO>Dn zPp z{6RU?riAo*UgzPP$eVDZgErS266wWqOI~y&W@opg^-nZ0V%%yY|K+T_!#UWGeZ=)p zSZ?4xg=+y>R{4dV1|C!gxSvONnJbKwPV%`Xwi|c#HJtbJ5}z^{6a}>s(N<7yh)dYh ziep0UX34a#m8~{AFRt}0n@T2=x|T7s+39i5uATbOM$fNA9fW)latKZ2P)j?rS>k6a z`k1f3FEyFc_GuQ>%B*x?+-W9tS6RZ0=@o_@LF&_n%GUVUTBXhsXC7&-OYZ~`!T#mNmqodbi z^N%m=%V1s)6)&eOTIevCsOZ>%lzcIZe$>=4+x=1~zKMuoubpf)%;oiZ@KYI=h1dzm zq)*m)Pav%6awxuQrI#E@Iazd@(~1-Mn8}ihZ6rn0jz5$_vYYN7ZOY0#-+@S{11z^7 z)`zP2!~w~b-nip{)*F*E6Jy^rl4N9adPMU*dLWt@DrwvmxG8xowTT#s2n^ApAC$WC(>@wW`w zG-j}*l6u%`vEW5O;}f$=#yeO>ZglkA)yrKj-H*#kmj+bKuNs{X+JC9R>Bg0dL!fL} z)ZNteNy{bT7_ra8f^8J5S3D7Sx8fUG;1jk>J*!2Vz0$7&jmWmO~;hP+K$`Q4q8yM-F)8b*l{?w zYWf1slcu`($n8r<4{7!)v2o*X+gMi>aZ?`~HNCl(73>YOgcA4UEgCBvcZE)togZfW zf4)H{GmbvTbFNQS3DJ>GRvo=j%yk}DohN$4M(?@t{2~hzA1r0rscJ~kl^!L4>*&g+ zw&_A0>Rpz^$;*Wtl?DeryJ}CGdFo=GN!(&Ho&T2K@^D(AeMlAeU@NYM#Zo{D_K0`3 zE$u98>c}pn56D1#UPRcFJ8hxQW{nF-w(f+I0TYJ;hkUyw5DFM6==&}#b zIb!R|q_+Kqw$WWD*~2axOEZ`w;~OtB2P7QFba$!IP8Ai#8Kc2M<3eN3IrX)QO1x{( zmN(cc8f&u7r13E}izJ6Jk6ybOuYhOsS)nEN`fhkLWT&DM5 z1lPhaTnC%rde{sjumx^_&%##N1~Jf&*|j+ynQ*LHII!1-=SjgZtp?@C`Tw--K_$VYnZ@4c~zW;6eB< zd=Ez9`|uDv43EGM;D_)iJO*QM1RjSU!4vQ#{1~2spTN`bQ+Nh`2G7EC@H~veQ8)%K zz>Dw_ybQ0v&*2yFD*O_D1+T%c;Wuy`PQdH%TlgLP9{vDtz#rjFcnkgne}=c=9XJW6 z;57UN-i5!y8F&x=27ib5;UDl%_!pdo58&UoK2U1d1tKsJj3SssFpFRjAwh&h5t2l( zijXWqiU>1ANEIPX1e*xyB4mhQ7a>!GED^Fr$Ppn|ggg;uijXftfe3{n6p2tQ0vEv{ aLWu~`bj!qFvqUHt!D)C5$Asb7>;D0*6kogm diff --git a/dist/index.js.map b/dist/index.js.map index 83cdd4d39b4a2cfd9d37b8ad33ad8cfb56d34661..69eec677a4a6442fc7fc0c4110718ab4e90cd35f 100644 GIT binary patch delta 1256 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 setTimeout(promise, 5000)); CloudRunnerLogger.log('Job created'); - await KubernetesLogService.cleanupLogDeployment(this.namespace, this.kubeClientApps, this.kubeClient); return result.body.metadata?.name; } catch (error) { @@ -292,7 +288,6 @@ class Kubernetes implements ProviderInterface { await this.kubeClientBatch.deleteNamespacedJob(this.jobName, this.namespace); await this.kubeClient.deleteNamespacedPod(this.podName, this.namespace); await KubernetesRole.deleteRole(this.serviceAccountName, this.namespace, this.rbacAuthorizationV1Api); - await KubernetesLogService.cleanupLogDeployment(this.namespace, this.kubeClientApps, this.kubeClient); } catch (error: any) { CloudRunnerLogger.log(`Failed to cleanup`); if (error.response.body.reason !== `NotFound`) { diff --git a/src/model/cloud-runner/providers/k8s/kubernetes-log-service.ts b/src/model/cloud-runner/providers/k8s/kubernetes-log-service.ts deleted file mode 100644 index eb118237..00000000 --- a/src/model/cloud-runner/providers/k8s/kubernetes-log-service.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { CoreV1Api } from '@kubernetes/client-node'; -import * as k8s from '@kubernetes/client-node'; -import CloudRunnerLogger from '../../services/core/cloud-runner-logger'; -import { CloudRunnerSystem } from '../../services/core/cloud-runner-system'; -class KubernetesLogService { - static async cleanupLogDeployment(namespace: string, kubeClientApps: k8s.AppsV1Api, kubeClient: CoreV1Api) { - if (!process.env.LOG_SERVICE_IP) { - return Promise.resolve(); - } - await kubeClient.deleteNamespacedService('http-fileserver', namespace); - await kubeClientApps.deleteNamespacedDeployment('http-fileserver', namespace); - } - - static async createLogService(serviceAccountName: string, namespace: string, kubeClient: CoreV1Api) { - const serviceAccount = new k8s.V1ServiceAccount(); - serviceAccount.apiVersion = 'v1'; - serviceAccount.kind = 'ServiceAccount'; - serviceAccount.metadata = { - name: serviceAccountName, - }; - serviceAccount.automountServiceAccountToken = true; - - return kubeClient.createNamespacedServiceAccount(namespace, serviceAccount); - } - - static async createLogDeployment(namespace: string, kubeClient: k8s.AppsV1Api, kubeClientCore: CoreV1Api) { - if (!process.env.LOG_SERVICE_IP) { - return `0.0.0.0`; - } - - // create a deployment with above json - const deployment = new k8s.V1Deployment(); - deployment.apiVersion = 'apps/v1'; - deployment.kind = 'Deployment'; - deployment.metadata = { - name: 'http-fileserver', - labels: { - service: 'http-fileserver', - }, - }; - deployment.spec = { - selector: { - matchLabels: { - service: 'http-fileserver', - }, - }, - replicas: 1, - strategy: {}, - template: { - metadata: { - labels: { - service: 'http-fileserver', - }, - }, - spec: { - containers: [ - { - image: 'node:18', - imagePullPolicy: 'Always', - name: 'http-fileserver', - ports: [{ containerPort: 80 }], - command: [ - 'bash', - '-c', - 'while true; do sleep 30; npm i files-upload-server -g; files-upload-server "downloads"; done;', - ], - resources: { - requests: { - memory: '750M', - cpu: '0.25', - }, - }, - }, - ], - restartPolicy: 'Always', - }, - }, - }; - await kubeClient.createNamespacedDeployment(namespace, deployment); - await this.createLogServiceExpose(namespace, kubeClientCore); - - // wait in loop until serivce ip address is exposed - - for (let index = 0; index < 10; index++) { - // wait for service to share ip address - await new Promise((resolve) => setTimeout(resolve, 10000)); - - // get cluster ip address of service - const service = await kubeClientCore.readNamespacedService('http-fileserver', namespace); - - // get podname of deployment - - const podname = await CloudRunnerSystem.Run( - `kubectl get pods -n ${namespace} -l service=http-fileserver -o jsonpath='{.items[0].metadata.name}'`, - false, - true, - ); - - // if status of pod is not running, then continue - const podStatus = await CloudRunnerSystem.Run( - `kubectl get pods -n ${namespace} ${podname} -o jsonpath='{.status.phase}'`, - false, - true, - ); - if (podStatus !== 'Running') { - CloudRunnerLogger.log(`Pod status: ${podStatus}`); - continue; - } - - const logs = await CloudRunnerSystem.Run(`kubectl logs ${podname} -f --timestamps -p`, false, true); - CloudRunnerLogger.log(`Logs: ${logs}`); - - // get cluster ip - const ip = service.body?.spec?.clusterIP; - if (ip && ip.length > 0) { - // log service json - CloudRunnerLogger.log(`Service: ${JSON.stringify(service.body, undefined, 4)}`); - CloudRunnerLogger.log(`Service IP: ${ip}`); - - return ip; - } - } - } - - // create kubernetes service to expose deployment - static async createLogServiceExpose(namespace: string, kubeClient: CoreV1Api) { - if (!process.env.LOG_SERVICE_IP) { - return; - } - - // create a service with above json - const service = new k8s.V1Service(); - service.apiVersion = 'v1'; - service.kind = 'Service'; - service.metadata = { - name: 'http-fileserver', - labels: { - service: 'http-fileserver', - }, - }; - service.spec = { - ports: [ - { - name: '80-80', - port: 80, - protocol: 'TCP', - targetPort: 80, - }, - ], - selector: { - service: 'http-fileserver', - }, - type: 'LoadBalancer', - }; - await kubeClient.createNamespacedService(namespace, service); - } -} -export default KubernetesLogService; diff --git a/src/model/cloud-runner/remote-client/index.ts b/src/model/cloud-runner/remote-client/index.ts index a1d11556..64ccdb2a 100644 --- a/src/model/cloud-runner/remote-client/index.ts +++ b/src/model/cloud-runner/remote-client/index.ts @@ -83,7 +83,7 @@ export class RemoteClient { await RemoteClient.runCustomHookFiles(`after-build`); // WIP - need to give the pod permissions to create config map - await RemoteClientLogger.printCollectedLogs(); + await RemoteClientLogger.handleLogManagementPostJob(); return new Promise((result) => result(``)); } 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 84c1b7f6..3ebbca7f 100644 --- a/src/model/cloud-runner/remote-client/remote-client-logger.ts +++ b/src/model/cloud-runner/remote-client/remote-client-logger.ts @@ -3,7 +3,6 @@ import fs from 'node:fs'; import path from 'node:path'; import CloudRunner from '../cloud-runner'; import CloudRunnerOptions from '../options/cloud-runner-options'; -import Kubernetes from '../providers/k8s'; export class RemoteClientLogger { private static get LogFilePath() { @@ -34,14 +33,20 @@ export class RemoteClientLogger { } } - public static async printCollectedLogs() { + public static async handleLogManagementPostJob() { if (CloudRunnerOptions.providerStrategy !== 'k8s') { return; } CloudRunnerLogger.log(`Collected Logs`); - CloudRunnerLogger.log(process.env[`LOG_SERVICE_IP`] || ``); + const hashedLogs = fs.readFileSync(RemoteClientLogger.LogFilePath).toString(); + CloudRunnerLogger.log(hashedLogs); const logs = fs.readFileSync(RemoteClientLogger.LogFilePath).toString(); CloudRunnerLogger.log(logs); - await Kubernetes.Instance.PushLogUpdate(logs); + + // loop for 5 mins logging the logs every minute + for (let index = 0; index < 5; index++) { + await new Promise((resolve) => setTimeout(resolve, 60000)); + CloudRunnerLogger.log(logs); + } } } diff --git a/src/model/cloud-runner/tests/cloud-runner-kubernetes.test.ts b/src/model/cloud-runner/tests/cloud-runner-kubernetes.test.ts deleted file mode 100644 index d51c26ce..00000000 --- a/src/model/cloud-runner/tests/cloud-runner-kubernetes.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import BuildParameters from '../../build-parameters'; -import { Cli } from '../../cli/cli'; -import UnityVersioning from '../../unity-versioning'; -import CloudRunner from '../cloud-runner'; -import CloudRunnerOptions from '../options/cloud-runner-options'; -import KubernetesLogService from '../providers/k8s/kubernetes-log-service'; -import CloudRunnerLogger from '../services/core/cloud-runner-logger'; -import setups from './cloud-runner-suite.test'; -import { v4 as uuidv4 } from 'uuid'; -import * as k8s from '@kubernetes/client-node'; -import ImageTag from '../../image-tag'; - -async function CreateParameters(overrides: any) { - if (overrides) { - Cli.options = overrides; - } - - return await BuildParameters.create(); -} - -describe('Cloud Runner Kubernetes', () => { - it('Responds', () => {}); - setups(); - if (CloudRunnerOptions.cloudRunnerDebug) { - it('Build create log service', async () => { - const overrides = { - versioning: 'None', - projectPath: 'test-project', - unityVersion: UnityVersioning.determineUnityVersion('test-project', UnityVersioning.read('test-project')), - targetPlatform: 'StandaloneLinux64', - cacheKey: `test-case-${uuidv4()}`, - customJob: ` - - name: 'step 1' - image: 'ubuntu' - commands: 'curl http://$LOG_SERVICE_IP:80''`, - }; - if (CloudRunnerOptions.providerStrategy !== `k8s`) { - return; - } - const buildParameter = await CreateParameters(overrides); - expect(buildParameter.projectPath).toEqual(overrides.projectPath); - - await CloudRunner.setup(buildParameter); - const kubeConfig = new k8s.KubeConfig(); - kubeConfig.loadFromDefault(); - const kubeClient = kubeConfig.makeApiClient(k8s.CoreV1Api); - const kubeClientApps = kubeConfig.makeApiClient(k8s.AppsV1Api); - - await KubernetesLogService.createLogDeployment('test', kubeClientApps, kubeClient); - - CloudRunnerLogger.log(`run 1 succeeded`); - }, 1_000_000_000); - it('curl log service', async () => { - const overrides = { - versioning: 'None', - projectPath: 'test-project', - unityVersion: UnityVersioning.read('test-project'), - targetPlatform: 'StandaloneLinux64', - cacheKey: `test-case-${uuidv4()}`, - customJob: ` - - name: 'step 1' - image: 'ubuntu' - commands: | - apt-get update - apt-get install curl -y - curl http://$LOG_SERVICE_IP:80`, - }; - if (CloudRunnerOptions.providerStrategy !== `k8s`) { - return; - } - const buildParameter = await CreateParameters(overrides); - expect(buildParameter.projectPath).toEqual(overrides.projectPath); - - const baseImage = new ImageTag(buildParameter); - const results = await CloudRunner.run(buildParameter, baseImage.toString()); - const buildSucceededString = 'Build succeeded'; - expect(results).toContain(buildSucceededString); - - CloudRunnerLogger.log(`run 1 succeeded`); - }, 1_000_000_000); - } -});