2018-08-21 15:45:59 +02:00
|
|
|
import com.sap.piper.JenkinsUtils
|
2018-08-31 10:22:43 +02:00
|
|
|
|
2018-08-21 15:45:59 +02:00
|
|
|
import org.junit.Before
|
|
|
|
import org.junit.Rule
|
|
|
|
import org.junit.Test
|
|
|
|
import org.junit.rules.ExpectedException
|
|
|
|
import org.junit.rules.RuleChain
|
|
|
|
|
2018-08-31 10:22:43 +02:00
|
|
|
|
2018-08-21 15:45:59 +02:00
|
|
|
import util.BasePiperTest
|
|
|
|
import util.JenkinsDockerExecuteRule
|
|
|
|
import util.JenkinsLoggingRule
|
2018-08-31 10:22:43 +02:00
|
|
|
import util.JenkinsReadYamlRule
|
2018-08-21 15:45:59 +02:00
|
|
|
import util.JenkinsShellCallRule
|
|
|
|
import util.JenkinsStepRule
|
|
|
|
import util.PluginMock
|
|
|
|
import util.Rules
|
|
|
|
|
2018-10-04 17:06:42 +02:00
|
|
|
import static org.hamcrest.Matchers.*
|
|
|
|
import static org.junit.Assert.assertThat
|
2018-08-21 15:45:59 +02:00
|
|
|
import static org.junit.Assert.assertTrue
|
|
|
|
import static org.junit.Assert.assertEquals
|
|
|
|
import static org.junit.Assert.assertFalse
|
|
|
|
|
|
|
|
class DockerExecuteOnKubernetesTest extends BasePiperTest {
|
|
|
|
private ExpectedException exception = ExpectedException.none()
|
|
|
|
private JenkinsDockerExecuteRule jder = new JenkinsDockerExecuteRule(this)
|
|
|
|
private JenkinsShellCallRule jscr = new JenkinsShellCallRule(this)
|
|
|
|
private JenkinsLoggingRule jlr = new JenkinsLoggingRule(this)
|
|
|
|
private JenkinsStepRule jsr = new JenkinsStepRule(this)
|
|
|
|
|
|
|
|
@Rule
|
|
|
|
public RuleChain ruleChain = Rules
|
|
|
|
.getCommonRules(this)
|
2018-08-31 10:22:43 +02:00
|
|
|
.around(new JenkinsReadYamlRule(this))
|
2018-08-21 15:45:59 +02:00
|
|
|
.around(exception)
|
|
|
|
.around(jder)
|
|
|
|
.around(jscr)
|
|
|
|
.around(jlr)
|
|
|
|
.around(jsr)
|
|
|
|
int whichDockerReturnValue = 0
|
|
|
|
def bodyExecuted
|
|
|
|
def dockerImage
|
|
|
|
def containerMap
|
|
|
|
def dockerEnvVars
|
|
|
|
def dockerWorkspace
|
|
|
|
def podName = ''
|
|
|
|
def podLabel = ''
|
|
|
|
def containersList = []
|
|
|
|
def imageList = []
|
|
|
|
def containerName = ''
|
2019-01-08 20:44:28 +02:00
|
|
|
def containerShell = ''
|
2018-08-21 15:45:59 +02:00
|
|
|
def envList = []
|
2018-10-04 17:06:42 +02:00
|
|
|
def portList = []
|
|
|
|
def containerCommands = []
|
2018-08-21 15:45:59 +02:00
|
|
|
|
|
|
|
|
|
|
|
@Before
|
|
|
|
void init() {
|
|
|
|
containersList = []
|
|
|
|
imageList = []
|
|
|
|
envList = []
|
2018-10-04 17:06:42 +02:00
|
|
|
portList = []
|
|
|
|
containerCommands = []
|
2018-08-21 15:45:59 +02:00
|
|
|
bodyExecuted = false
|
|
|
|
JenkinsUtils.metaClass.static.isPluginActive = { def s -> new PluginMock(s).isActive() }
|
|
|
|
helper.registerAllowedMethod('sh', [Map.class], {return whichDockerReturnValue})
|
|
|
|
helper.registerAllowedMethod('container', [Map.class, Closure.class], { Map config, Closure body -> container(config){body()}
|
|
|
|
})
|
|
|
|
helper.registerAllowedMethod('podTemplate', [Map.class, Closure.class], { Map options, Closure body ->
|
|
|
|
podName = options.name
|
|
|
|
podLabel = options.label
|
|
|
|
options.containers.each { option ->
|
|
|
|
containersList.add(option.name)
|
2018-10-08 11:54:13 +02:00
|
|
|
imageList.add(option.image.toString())
|
2018-08-21 15:45:59 +02:00
|
|
|
envList.add(option.envVars)
|
2018-10-04 17:06:42 +02:00
|
|
|
portList.add(option.ports)
|
|
|
|
if (option.command) {
|
|
|
|
containerCommands.add(option.command)
|
|
|
|
}
|
2018-08-21 15:45:59 +02:00
|
|
|
}
|
|
|
|
body()
|
|
|
|
})
|
|
|
|
helper.registerAllowedMethod('node', [String.class, Closure.class], { String nodeName, Closure body -> body() })
|
|
|
|
helper.registerAllowedMethod('envVar', [Map.class], { Map option -> return option })
|
|
|
|
helper.registerAllowedMethod('containerTemplate', [Map.class], { Map option -> return option })
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
void testRunOnPodNoContainerMapOnlyDockerImage() throws Exception {
|
2018-11-05 12:24:25 +02:00
|
|
|
jsr.step.dockerExecuteOnKubernetes(
|
|
|
|
script: nullScript,
|
|
|
|
juStabUtils: utils,
|
2018-08-21 15:45:59 +02:00
|
|
|
dockerImage: 'maven:3.5-jdk-8-alpine',
|
|
|
|
dockerOptions: '-it',
|
|
|
|
dockerVolumeBind: ['my_vol': '/my_vol'],
|
2018-10-08 11:54:13 +02:00
|
|
|
dockerEnvVars: ['http_proxy': 'http://proxy:8000'], dockerWorkspace: '/home/piper'
|
|
|
|
){
|
|
|
|
bodyExecuted = true
|
2018-08-21 15:45:59 +02:00
|
|
|
}
|
2018-10-08 11:54:13 +02:00
|
|
|
assertThat(containersList, hasItem('container-exec'))
|
|
|
|
assertThat(imageList, hasItem('maven:3.5-jdk-8-alpine'))
|
|
|
|
assertThat(envList.toString(), containsString('http_proxy'))
|
|
|
|
assertThat(envList.toString(), containsString('http://proxy:8000'))
|
|
|
|
assertThat(envList.toString(), containsString('/home/piper'))
|
|
|
|
assertThat(bodyExecuted, is(true))
|
2018-10-04 17:06:42 +02:00
|
|
|
assertThat(containerCommands.size(), is(1))
|
2018-08-21 15:45:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
void testDockerExecuteOnKubernetesWithCustomContainerMap() throws Exception {
|
2018-10-04 17:06:42 +02:00
|
|
|
jsr.step.dockerExecuteOnKubernetes(script: nullScript,
|
2018-08-21 15:45:59 +02:00
|
|
|
containerMap: ['maven:3.5-jdk-8-alpine': 'mavenexecute']) {
|
|
|
|
container(name: 'mavenexecute') {
|
|
|
|
bodyExecuted = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
assertEquals('mavenexecute', containerName)
|
|
|
|
assertTrue(containersList.contains('mavenexecute'))
|
|
|
|
assertTrue(imageList.contains('maven:3.5-jdk-8-alpine'))
|
|
|
|
assertTrue(bodyExecuted)
|
2018-10-04 17:06:42 +02:00
|
|
|
assertThat(containerCommands.size(), is(1))
|
2018-08-21 15:45:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
void testDockerExecuteOnKubernetesWithCustomJnlpWithContainerMap() throws Exception {
|
|
|
|
nullScript.commonPipelineEnvironment.configuration = ['general': ['jenkinsKubernetes': ['jnlpAgent': 'myJnalpAgent']]]
|
2018-10-04 17:06:42 +02:00
|
|
|
jsr.step.dockerExecuteOnKubernetes(script: nullScript,
|
2018-08-21 15:45:59 +02:00
|
|
|
containerMap: ['maven:3.5-jdk-8-alpine': 'mavenexecute']) {
|
|
|
|
container(name: 'mavenexecute') {
|
|
|
|
bodyExecuted = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
assertEquals('mavenexecute', containerName)
|
|
|
|
assertTrue(containersList.contains('mavenexecute'))
|
|
|
|
assertTrue(imageList.contains('maven:3.5-jdk-8-alpine'))
|
|
|
|
assertTrue(containersList.contains('jnlp'))
|
|
|
|
assertTrue(imageList.contains('myJnalpAgent'))
|
|
|
|
assertTrue(bodyExecuted)
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
void testDockerExecuteOnKubernetesWithCustomJnlpWithDockerImage() throws Exception {
|
|
|
|
nullScript.commonPipelineEnvironment.configuration = ['general': ['jenkinsKubernetes': ['jnlpAgent': 'myJnalpAgent']]]
|
2018-11-05 12:24:25 +02:00
|
|
|
jsr.step.dockerExecuteOnKubernetes(
|
|
|
|
script: nullScript,
|
|
|
|
juStabUtils: utils,
|
2018-08-21 15:45:59 +02:00
|
|
|
dockerImage: 'maven:3.5-jdk-8-alpine') {
|
|
|
|
bodyExecuted = true
|
|
|
|
}
|
|
|
|
assertEquals('container-exec', containerName)
|
|
|
|
assertTrue(containersList.contains('jnlp'))
|
|
|
|
assertTrue(containersList.contains('container-exec'))
|
|
|
|
assertTrue(imageList.contains('myJnalpAgent'))
|
|
|
|
assertTrue(imageList.contains('maven:3.5-jdk-8-alpine'))
|
|
|
|
assertTrue(bodyExecuted)
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
void testDockerExecuteOnKubernetesWithCustomWorkspace() throws Exception {
|
2018-10-04 17:06:42 +02:00
|
|
|
jsr.step.dockerExecuteOnKubernetes(script: nullScript,
|
2018-08-21 15:45:59 +02:00
|
|
|
containerMap: ['maven:3.5-jdk-8-alpine': 'mavenexecute'],
|
|
|
|
dockerWorkspace: '/home/piper') {
|
|
|
|
container(name: 'mavenexecute') {
|
|
|
|
bodyExecuted = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
assertTrue(envList.toString().contains('/home/piper'))
|
|
|
|
assertTrue(bodyExecuted)
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
void testDockerExecuteOnKubernetesWithCustomEnv() throws Exception {
|
2018-10-04 17:06:42 +02:00
|
|
|
jsr.step.dockerExecuteOnKubernetes(script: nullScript,
|
2018-08-21 15:45:59 +02:00
|
|
|
containerMap: ['maven:3.5-jdk-8-alpine': 'mavenexecute'],
|
|
|
|
dockerEnvVars: ['customEnvKey': 'customEnvValue']) {
|
|
|
|
container(name: 'mavenexecute') {
|
|
|
|
bodyExecuted = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
assertTrue(envList.toString().contains('customEnvKey') && envList.toString().contains('customEnvValue'))
|
|
|
|
assertTrue(bodyExecuted)
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
void testDockerExecuteOnKubernetesUpperCaseContainerName() throws Exception {
|
2018-10-04 17:06:42 +02:00
|
|
|
jsr.step.dockerExecuteOnKubernetes(script: nullScript,
|
2018-08-21 15:45:59 +02:00
|
|
|
containerMap: ['maven:3.5-jdk-8-alpine': 'MAVENEXECUTE'],
|
|
|
|
dockerEnvVars: ['customEnvKey': 'customEnvValue']) {
|
|
|
|
container(name: 'mavenexecute') {
|
|
|
|
bodyExecuted = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
assertEquals('mavenexecute', containerName)
|
|
|
|
assertTrue(containersList.contains('mavenexecute'))
|
|
|
|
assertTrue(imageList.contains('maven:3.5-jdk-8-alpine'))
|
|
|
|
assertTrue(bodyExecuted)
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
void testDockerExecuteOnKubernetesEmptyContainerMapNoDockerImage() throws Exception {
|
|
|
|
exception.expect(IllegalArgumentException.class);
|
2018-11-05 12:24:25 +02:00
|
|
|
jsr.step.dockerExecuteOnKubernetes(
|
|
|
|
script: nullScript,
|
|
|
|
juStabUtils: utils,
|
2018-08-21 15:45:59 +02:00
|
|
|
containerMap: [:],
|
|
|
|
dockerEnvVars: ['customEnvKey': 'customEnvValue']) {
|
|
|
|
container(name: 'jnlp') {
|
|
|
|
bodyExecuted = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
assertFalse(bodyExecuted)
|
|
|
|
}
|
|
|
|
|
2018-10-04 17:06:42 +02:00
|
|
|
@Test
|
|
|
|
void testSidecarDefault() {
|
|
|
|
List portMapping = []
|
|
|
|
helper.registerAllowedMethod('portMapping', [Map.class], {m ->
|
|
|
|
portMapping.add(m)
|
|
|
|
return m
|
|
|
|
})
|
|
|
|
jsr.step.dockerExecuteOnKubernetes(
|
|
|
|
script: nullScript,
|
2018-11-05 12:24:25 +02:00
|
|
|
juStabUtils: utils,
|
2018-10-04 17:06:42 +02:00
|
|
|
containerCommands: ['selenium/standalone-chrome': ''],
|
|
|
|
containerEnvVars: [
|
|
|
|
'selenium/standalone-chrome': ['customEnvKey': 'customEnvValue']
|
|
|
|
],
|
|
|
|
containerMap: [
|
|
|
|
'maven:3.5-jdk-8-alpine': 'mavenexecute',
|
|
|
|
'selenium/standalone-chrome': 'selenium'
|
|
|
|
],
|
|
|
|
containerName: 'mavenexecute',
|
|
|
|
containerPortMappings: [
|
|
|
|
'selenium/standalone-chrome': [[containerPort: 4444, hostPort: 4444]]
|
|
|
|
],
|
|
|
|
containerWorkspaces: [
|
|
|
|
'selenium/standalone-chrome': ''
|
|
|
|
],
|
|
|
|
dockerWorkspace: '/home/piper'
|
|
|
|
) {
|
|
|
|
bodyExecuted = true
|
|
|
|
}
|
|
|
|
|
|
|
|
assertThat(bodyExecuted, is(true))
|
|
|
|
assertThat(containerName, is('mavenexecute'))
|
|
|
|
|
|
|
|
assertThat(containersList, allOf(
|
|
|
|
hasItem('jnlp'),
|
|
|
|
hasItem('mavenexecute'),
|
|
|
|
hasItem('selenium'),
|
|
|
|
))
|
|
|
|
assertThat(imageList, allOf(
|
|
|
|
hasItem('s4sdk/jenkins-agent-k8s:latest'),
|
|
|
|
hasItem('maven:3.5-jdk-8-alpine'),
|
|
|
|
hasItem('selenium/standalone-chrome'),
|
|
|
|
))
|
|
|
|
assertThat(portList, hasItem(hasItem([name: 'selenium0', containerPort: 4444, hostPort: 4444])))
|
|
|
|
assertThat(portMapping, hasItem([name: 'selenium0', containerPort: 4444, hostPort: 4444]))
|
|
|
|
assertThat(containerCommands.size(), is(1))
|
|
|
|
assertThat(envList, hasItem(hasItem(allOf(hasEntry('key', 'customEnvKey'), hasEntry ('value','customEnvValue')))))
|
|
|
|
}
|
|
|
|
|
2019-01-08 20:44:28 +02:00
|
|
|
@Test
|
|
|
|
void testDockerExecuteOnKubernetesWithCustomShell() {
|
|
|
|
jsr.step.dockerExecuteOnKubernetes(
|
|
|
|
script: nullScript,
|
|
|
|
juStabUtils: utils,
|
|
|
|
dockerImage: 'maven:3.5-jdk-8-alpine',
|
|
|
|
containerShell: '/busybox/sh'
|
|
|
|
) {
|
|
|
|
//nothing to exeute
|
|
|
|
}
|
|
|
|
assertThat(containerShell, is('/busybox/sh'))
|
|
|
|
}
|
|
|
|
|
2018-10-04 17:06:42 +02:00
|
|
|
|
2018-08-21 15:45:59 +02:00
|
|
|
private container(options, body) {
|
|
|
|
containerName = options.name
|
2019-01-08 20:44:28 +02:00
|
|
|
containerShell = options.shell
|
2018-08-21 15:45:59 +02:00
|
|
|
body()
|
|
|
|
}
|
|
|
|
}
|