Implement yaml extensions overwriting the default pod/container spec (#75)

* Implement yaml extensions overwriting the default pod/container spec

* format files

* Extend specs for container job and include docker and k8s tests in k8s

* Create table tests for docker tests

* included warnings and extracted append logic as generic

* updated merge to allow for file read

* reverted back examples and k8s/tests

* reverted back docker tests

* Tests for extension prepare-job

* Fix lint and format and merge error

* Added basic test for container step

* revert hooklib since new definition for container options is received from a file

* revert docker options since create options are a string

* Fix revert

* Update package locks and deps

* included example of extension.yaml. Added side-car container that was missing

* Ignore spec modification for the service containers, change selector to

* fix lint error

* Add missing image override

* Add comment explaining merge object meta with job and pod

* fix test
This commit is contained in:
Nikola Jokic
2023-09-25 11:49:03 +02:00
committed by GitHub
parent 5107bb1d41
commit 4cdcf09c43
13 changed files with 672 additions and 102 deletions

View File

@@ -10,8 +10,13 @@ import {
waitForJobToComplete,
waitForPodPhases
} from '../k8s'
import { containerVolumes, PodPhase } from '../k8s/utils'
import { JOB_CONTAINER_NAME } from './constants'
import {
containerVolumes,
PodPhase,
mergeContainerWithOptions,
readExtensionFromFile
} from '../k8s/utils'
import { JOB_CONTAINER_EXTENSION_NAME, JOB_CONTAINER_NAME } from './constants'
export async function runContainerStep(
stepContainer: RunContainerStepArgs
@@ -25,10 +30,12 @@ export async function runContainerStep(
secretName = await createSecretForEnvs(stepContainer.environmentVariables)
}
core.debug(`Created secret ${secretName} for container job envs`)
const container = createPodSpec(stepContainer, secretName)
const extension = readExtensionFromFile()
const job = await createJob(container)
core.debug(`Created secret ${secretName} for container job envs`)
const container = createContainerSpec(stepContainer, secretName, extension)
const job = await createJob(container, extension)
if (!job.metadata?.name) {
throw new Error(
`Expected job ${JSON.stringify(
@@ -69,9 +76,10 @@ export async function runContainerStep(
return Number(exitCode) || 1
}
function createPodSpec(
function createContainerSpec(
container: RunContainerStepArgs,
secretName?: string
secretName?: string,
extension?: k8s.V1PodTemplateSpec
): k8s.V1Container {
const podContainer = new k8s.V1Container()
podContainer.name = JOB_CONTAINER_NAME
@@ -96,5 +104,16 @@ function createPodSpec(
}
podContainer.volumeMounts = containerVolumes(undefined, false, true)
if (!extension) {
return podContainer
}
const from = extension.spec?.containers?.find(
c => c.name === JOB_CONTAINER_EXTENSION_NAME
)
if (from) {
mergeContainerWithOptions(podContainer, from)
}
return podContainer
}