test: K8sNodeInitDeployerTest

This commit is contained in:
2026-05-03 17:03:48 +02:00
parent a54db66cb9
commit d0231de041
2 changed files with 165 additions and 1 deletions

View File

@@ -132,7 +132,6 @@ exit 0
.withPrivileged(true)
.withHostMounts(mounts)
.withPodName(buildPodName(nodeName))
.withNamespace(client.config.namespace)
.build()
}

View File

@@ -0,0 +1,165 @@
package nextflow.k8s
import nextflow.k8s.client.K8sClient
import nextflow.k8s.model.PodSpecBuilder
import spock.lang.Specification
class K8sNodeInitDeployerTest extends Specification {
def setup() {
PodSpecBuilder.VOLUMES.set(0)
}
def 'should not deploy pods when node init is disabled' () {
given:
def client = Mock(K8sClient)
def config = new K8sConfig(nodeInit: [enabled: false])
def deployer = new K8sNodeInitDeployer(client, config, 'run-foo')
when:
deployer.deploy()
then:
0 * client.nodeList()
0 * client.podCreate(_)
}
def 'should deploy one init pod for each node' () {
given:
def client = Mock(K8sClient)
def config = new K8sConfig(nodeInit: [
enabled: true,
image: 'ubuntu:latest',
command: ['/bin/bash', '-c', 'echo init']
])
def deployer = new K8sNodeInitDeployer(client, config, 'run-foo')
when:
deployer.deploy()
then:
1 * client.nodeList() >> [
items: [
[metadata: [name: 'node-a']],
[metadata: [name: 'node-b']]
]
]
then:
1 * client.podCreate({ Map spec ->
spec.kind == 'Pod'
spec.metadata.name == 'nf-init-run-foo-node-a'
spec.metadata.namespace == 'default'
spec.spec.nodeName == 'node-a'
spec.spec.restartPolicy == 'Never'
def container = spec.spec.containers[0]
container.name == 'nf-init-run-foo-node-a'
container.image == 'ubuntu:latest'
container.command == ['/bin/bash', '-c', 'echo init']
container.securityContext.privileged == true
spec.spec.volumes*.hostPath*.path as Set == ['/sys', '/dev', '/lib/modules'] as Set
container.volumeMounts*.mountPath as Set == ['/sys', '/dev', '/lib/modules'] as Set
})
then:
1 * client.podCreate({ Map spec ->
spec.kind == 'Pod'
spec.metadata.name == 'nf-init-run-foo-node-b'
spec.spec.nodeName == 'node-b'
def container = spec.spec.containers[0]
container.name == 'nf-init-run-foo-node-b'
container.image == 'ubuntu:latest'
container.command == ['/bin/bash', '-c', 'echo init']
container.securityContext.privileged == true
})
0 * client._
}
def 'should lowercase and truncate generated pod names' () {
given:
def client = Mock(K8sClient)
def runName = 'run-name-with-a-very-long-identifier'
def config = new K8sConfig(nodeInit: [
enabled: true,
image: 'ubuntu:latest',
command: ['true']
])
def deployer = new K8sNodeInitDeployer(client, config, runName)
when:
deployer.deploy()
then:
1 * client.nodeList() >> [
items: [
[metadata: [name: 'NODE-WITH-A-VERY-LONG-NAME-ABCDEFGHIJKLMNOPQRSTUVWXYZ']]
]
]
then:
1 * client.podCreate({ Map spec ->
spec.metadata.name == 'nf-init-run-name-with-a-very-long-identifier-node-with-a-very-l'
spec.metadata.name.size() == 63
spec.metadata.name == spec.metadata.name.toLowerCase()
spec.spec.nodeName == 'NODE-WITH-A-VERY-LONG-NAME-ABCDEFGHIJKLMNOPQRSTUVWXYZ'
})
then:
0 * client._
}
def 'should not cleanup pods when node init is disabled' () {
given:
def client = Mock(K8sClient)
def config = new K8sConfig(nodeInit: [enabled: false, cleanup: true])
def deployer = new K8sNodeInitDeployer(client, config, 'run-foo')
when:
deployer.cleanup()
then:
0 * client.nodeList()
0 * client.podDelete(_)
}
def 'should not cleanup pods when cleanup is disabled' () {
given:
def client = Mock(K8sClient)
def config = new K8sConfig(nodeInit: [enabled: true, cleanup: false])
def deployer = new K8sNodeInitDeployer(client, config, 'run-foo')
when:
deployer.cleanup()
then:
0 * client.nodeList()
0 * client.podDelete(_)
}
def 'should cleanup one init pod for each node' () {
given:
def client = Mock(K8sClient)
def config = new K8sConfig(nodeInit: [enabled: true, cleanup: true])
def deployer = new K8sNodeInitDeployer(client, config, 'run-foo')
when:
deployer.cleanup()
then:
1 * client.nodeList() >> [
items: [
[metadata: [name: 'node-a']],
[metadata: [name: 'NODE-B']]
]
]
then:
1 * client.podDelete('nf-init-run-foo-node-a')
1 * client.podDelete('nf-init-run-foo-node-b')
0 * client._
}
}