fixed testing adding storage class and persistent volume and timeout to wait for cleanup

This commit is contained in:
Nikola Jokic
2022-06-06 12:56:50 +02:00
parent ec8131abb7
commit 0ebccbd8c6
5 changed files with 50 additions and 19 deletions

View File

@@ -1 +1 @@
jest.setTimeout(90000) jest.setTimeout(500000)

View File

@@ -1 +1 @@
jest.setTimeout(90000) jest.setTimeout(500000)

View File

@@ -55,9 +55,9 @@ describe('e2e', () => {
const runContainerStepContent = fs.readFileSync(runContainerStepJsonPath) const runContainerStepContent = fs.readFileSync(runContainerStepJsonPath)
const runContainerStepData = JSON.parse(runContainerStepContent.toString()) const runContainerStepData = JSON.parse(runContainerStepContent.toString())
// await expect( await expect(
// runContainerStep(runContainerStepData.args) runContainerStep(runContainerStepData.args)
// ).resolves.not.toThrow() ).resolves.not.toThrow()
await expect(cleanupJob()).resolves.not.toThrow() await expect(cleanupJob()).resolves.not.toThrow()
}) })

View File

@@ -1,7 +1,7 @@
import { TestHelper } from './test-setup' import * as fs from 'fs'
import * as path from 'path' import * as path from 'path'
import { runContainerStep } from '../src/hooks' import { runContainerStep } from '../src/hooks'
import * as fs from 'fs' import { TestHelper } from './test-setup'
jest.useRealTimers() jest.useRealTimers()
@@ -27,5 +27,7 @@ describe('Run container step', () => {
}) })
afterEach(async () => { afterEach(async () => {
await testHelper.cleanup() await testHelper.cleanup()
// wait for the job cleanup
await new Promise(resolve => setTimeout(resolve, 300 * 1000))
}) })
}) })

View File

@@ -1,33 +1,34 @@
import * as k8s from '@kubernetes/client-node'
import * as fs from 'fs' import * as fs from 'fs'
import { v4 as uuidv4 } from 'uuid' import { v4 as uuidv4 } from 'uuid'
import * as k8s from '@kubernetes/client-node'
import { V1PersistentVolumeClaim } from '@kubernetes/client-node'
const kc = new k8s.KubeConfig() const kc = new k8s.KubeConfig()
kc.loadFromDefault() kc.loadFromDefault()
const k8sApi = kc.makeApiClient(k8s.CoreV1Api) const k8sApi = kc.makeApiClient(k8s.CoreV1Api)
const k8sStorageApi = kc.makeApiClient(k8s.StorageV1Api)
export class TestHelper { export class TestHelper {
private tempDirPath: string private tempDirPath: string
private podName: string private podName: string
constructor() { constructor() {
this.tempDirPath = `${__dirname}/_temp/runner` this.tempDirPath = `${__dirname}/_temp/runner`
this.podName = uuidv4().replace('-', '') this.podName = uuidv4().replace(/-/g, '')
} }
public async initialize(): Promise<void> { public async initialize(): Promise<void> {
await this.cleanupK8sResources()
await this.createTestVolume()
await this.createTestJobPod()
fs.mkdirSync(`${this.tempDirPath}/work/repo/repo`, { recursive: true })
fs.mkdirSync(`${this.tempDirPath}/externals`, { recursive: true })
process.env['ACTIONS_RUNNER_POD_NAME'] = `${this.podName}` process.env['ACTIONS_RUNNER_POD_NAME'] = `${this.podName}`
process.env['ACTIONS_RUNNER_CLAIM_NAME'] = `${this.podName}-work` process.env['ACTIONS_RUNNER_CLAIM_NAME'] = `${this.podName}-work`
process.env['RUNNER_WORKSPACE'] = `${this.tempDirPath}/work/repo` process.env['RUNNER_WORKSPACE'] = `${this.tempDirPath}/work/repo`
process.env['GITHUB_WORKSPACE'] = `${this.tempDirPath}/work/repo/repo` process.env['GITHUB_WORKSPACE'] = `${this.tempDirPath}/work/repo/repo`
process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default' process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE'] = 'default'
await this.cleanupK8sResources()
await this.createTestVolume()
await this.createTestJobPod()
fs.mkdirSync(`${this.tempDirPath}/work/repo/repo`, { recursive: true })
fs.mkdirSync(`${this.tempDirPath}/externals`, { recursive: true })
} }
public async cleanup(): Promise<void> { public async cleanup(): Promise<void> {
@@ -46,6 +47,8 @@ export class TestHelper {
0 0
) )
.catch(e => {}) .catch(e => {})
await k8sApi.deletePersistentVolume('work').catch(e => {})
await k8sStorageApi.deleteStorageClass('local-storage').catch(e => {})
await k8sApi await k8sApi
.deleteNamespacedPod(this.podName, 'default', undefined, undefined, 0) .deleteNamespacedPod(this.podName, 'default', undefined, undefined, 0)
.catch(e => {}) .catch(e => {})
@@ -90,15 +93,41 @@ export class TestHelper {
} }
public async createTestVolume() { public async createTestVolume() {
var volume: V1PersistentVolumeClaim = { var sc: k8s.V1StorageClass = {
metadata: {
name: 'local-storage'
},
provisioner: 'kubernetes.io/no-provisioner',
volumeBindingMode: 'Immediate'
}
await k8sStorageApi.createStorageClass(sc)
var volume: k8s.V1PersistentVolume = {
metadata: {
name: 'work'
},
spec: {
storageClassName: 'local-storage',
capacity: {
storage: '2Gi'
},
volumeMode: 'Filesystem',
accessModes: ['ReadWriteOnce'],
hostPath: {
path: this.tempDirPath
}
}
}
await k8sApi.createPersistentVolume(volume)
var volumeClaim: k8s.V1PersistentVolumeClaim = {
metadata: { metadata: {
name: `${this.podName}-work` name: `${this.podName}-work`
}, },
spec: { spec: {
accessModes: ['ReadWriteOnce'], accessModes: ['ReadWriteOnce'],
volumeMode: 'Filesystem', volumeMode: 'Filesystem',
storageClassName: 'local-storage',
volumeName: 'work',
resources: { resources: {
requests: { requests: {
storage: '1Gi' storage: '1Gi'
@@ -106,6 +135,6 @@ export class TestHelper {
} }
} }
} }
await k8sApi.createNamespacedPersistentVolumeClaim('default', volume) await k8sApi.createNamespacedPersistentVolumeClaim('default', volumeClaim)
} }
} }