2018-07-30 09:28:24 +02:00
#!groovy
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.ExpectedException
import org.junit.rules.RuleChain
import org.yaml.snakeyaml.Yaml
import util.BasePiperTest
2018-09-03 11:09:09 +02:00
import util.JenkinsCredentialsRule
2018-07-30 09:28:24 +02:00
import util.JenkinsEnvironmentRule
import util.JenkinsDockerExecuteRule
import util.JenkinsLoggingRule
import util.JenkinsShellCallRule
import util.JenkinsStepRule
import util.JenkinsWriteFileRule
2018-08-31 10:22:43 +02:00
import util.JenkinsReadYamlRule
2018-07-30 09:28:24 +02:00
import util.Rules
2018-08-29 10:01:16 +02:00
import static org . junit . Assert . assertThat
import static org . hamcrest . Matchers . hasItem
import static org . hamcrest . Matchers . hasEntry
import static org . hamcrest . Matchers . containsString
2018-07-30 09:28:24 +02:00
class CloudFoundryDeployTest extends BasePiperTest {
private ExpectedException thrown = ExpectedException . none ( )
private JenkinsLoggingRule jlr = new JenkinsLoggingRule ( this )
private JenkinsShellCallRule jscr = new JenkinsShellCallRule ( this )
private JenkinsWriteFileRule jwfr = new JenkinsWriteFileRule ( this )
private JenkinsDockerExecuteRule jedr = new JenkinsDockerExecuteRule ( this )
private JenkinsStepRule jsr = new JenkinsStepRule ( this )
private JenkinsEnvironmentRule jer = new JenkinsEnvironmentRule ( this )
2018-08-31 14:14:06 +02:00
private JenkinsReadYamlRule jryr = new JenkinsReadYamlRule ( this )
2018-07-30 09:28:24 +02:00
@Rule
public RuleChain rules = Rules
. getCommonRules ( this )
2018-08-31 14:14:06 +02:00
. around ( jryr )
2018-07-30 09:28:24 +02:00
. around ( thrown )
. around ( jlr )
. around ( jscr )
. around ( jwfr )
. around ( jedr )
. around ( jer )
2018-09-03 11:09:09 +02:00
. around ( new JenkinsCredentialsRule ( this ) . withCredentials ( 'test_cfCredentialsId' , 'test_cf' , '********' ) )
2018-07-30 09:28:24 +02:00
. around ( jsr ) // needs to be activated after jedr, otherwise executeDocker is not mocked
@Test
void testNoTool ( ) throws Exception {
nullScript . commonPipelineEnvironment . configuration = [
general: [
camSystemRole: 'testRole' ,
cfCredentialsId: 'myCreds'
] ,
stages: [
acceptance: [
cfOrg: 'testOrg' ,
cfSpace: 'testSpace' ,
deployUser: 'testUser' ,
]
] ,
steps: [
cloudFoundryDeploy: [ ]
]
]
jsr . step . cloudFoundryDeploy ( [
script: nullScript ,
juStabUtils: utils ,
deployTool: '' ,
stageName: 'acceptance' ,
] )
2018-08-29 10:01:16 +02:00
// asserts
assertThat ( jlr . log , containsString ( '[cloudFoundryDeploy] General parameters: deployTool=, deployType=standard, cfApiEndpoint=https://api.cf.eu10.hana.ondemand.com, cfOrg=testOrg, cfSpace=testSpace, cfCredentialsId=myCreds, deployUser=testUser' ) )
2018-07-30 09:28:24 +02:00
}
@Test
void testNotAvailableTool ( ) throws Exception {
nullScript . commonPipelineEnvironment . configuration = [
general: [
cfCredentialsId: 'myCreds'
] ,
stages: [
acceptance: [
cfOrg: 'testOrg' ,
cfSpace: 'testSpace' ,
deployUser: 'testUser' ,
]
] ,
steps: [
cloudFoundryDeploy: [ ]
]
]
jsr . step . cloudFoundryDeploy ( [
script: nullScript ,
juStabUtils: utils ,
deployTool: 'notAvailable' ,
stageName: 'acceptance'
] )
2018-08-29 10:01:16 +02:00
// asserts
assertThat ( jlr . log , containsString ( '[cloudFoundryDeploy] General parameters: deployTool=notAvailable, deployType=standard, cfApiEndpoint=https://api.cf.eu10.hana.ondemand.com, cfOrg=testOrg, cfSpace=testSpace, cfCredentialsId=myCreds, deployUser=testUser' ) )
2018-07-30 09:28:24 +02:00
}
@Test
void testCfNativeWithAppName ( ) {
2018-10-17 11:01:09 +02:00
jryr . registerYaml ( 'test.yml' , "applications: [[name: 'manifestAppName']]" )
helper . registerAllowedMethod ( 'writeYaml' , [ Map ] , { Map parameters - >
generatedFile = parameters . file
data = parameters . data
} )
2018-07-30 09:28:24 +02:00
jsr . step . cloudFoundryDeploy ( [
script: nullScript ,
juStabUtils: utils ,
deployTool: 'cf_native' ,
cfOrg: 'testOrg' ,
cfSpace: 'testSpace' ,
cfCredentialsId: 'test_cfCredentialsId' ,
cfAppName: 'testAppName' ,
cfManifest: 'test.yml'
] )
2018-08-29 10:01:16 +02:00
// asserts
assertThat ( jedr . dockerParams , hasEntry ( 'dockerImage' , 's4sdk/docker-cf-cli' ) )
assertThat ( jedr . dockerParams , hasEntry ( 'dockerWorkspace' , '/home/piper' ) )
assertThat ( jedr . dockerParams . dockerEnvVars , hasEntry ( 'STATUS_CODE' , "${200}" ) )
assertThat ( jscr . shell , hasItem ( containsString ( 'cf login -u "test_cf" -p \'********\' -a https://api.cf.eu10.hana.ondemand.com -o "testOrg" -s "testSpace"' ) ) )
2018-11-07 11:39:30 +02:00
assertThat ( jscr . shell , hasItem ( containsString ( "cf push testAppName -f 'test.yml'" ) ) )
2018-07-30 09:28:24 +02:00
}
@Test
void testCfNativeWithAppNameCustomApi ( ) {
2018-10-17 11:01:09 +02:00
jryr . registerYaml ( 'test.yml' , "applications: [[name: 'manifestAppName']]" )
helper . registerAllowedMethod ( 'writeYaml' , [ Map ] , { Map parameters - >
generatedFile = parameters . file
data = parameters . data
} )
2018-07-30 09:28:24 +02:00
jsr . step . cloudFoundryDeploy ( [
script: nullScript ,
juStabUtils: utils ,
deployTool: 'cf_native' ,
cfApiEndpoint: 'https://customApi' ,
cfOrg: 'testOrg' ,
cfSpace: 'testSpace' ,
cfCredentialsId: 'test_cfCredentialsId' ,
cfAppName: 'testAppName' ,
cfManifest: 'test.yml'
] )
2018-08-29 10:01:16 +02:00
// asserts
assertThat ( jscr . shell , hasItem ( containsString ( 'cf login -u "test_cf" -p \'********\' -a https://customApi -o "testOrg" -s "testSpace"' ) ) )
2018-07-30 09:28:24 +02:00
}
@Test
void testCfNativeWithAppNameCompatible ( ) {
2018-10-17 11:01:09 +02:00
jryr . registerYaml ( 'test.yml' , "applications: [[name: 'manifestAppName']]" )
helper . registerAllowedMethod ( 'writeYaml' , [ Map ] , { Map parameters - >
generatedFile = parameters . file
data = parameters . data
} )
2018-07-30 09:28:24 +02:00
jsr . step . cloudFoundryDeploy ( [
script: nullScript ,
juStabUtils: utils ,
deployTool: 'cf_native' ,
cloudFoundry: [
org: 'testOrg' ,
space: 'testSpace' ,
credentialsId: 'test_cfCredentialsId' ,
appName: 'testAppName' ,
manifest: 'test.yml'
]
] )
2018-08-29 10:01:16 +02:00
// asserts
assertThat ( jedr . dockerParams , hasEntry ( 'dockerImage' , 's4sdk/docker-cf-cli' ) )
assertThat ( jedr . dockerParams , hasEntry ( 'dockerWorkspace' , '/home/piper' ) )
assertThat ( jedr . dockerParams . dockerEnvVars , hasEntry ( 'STATUS_CODE' , "${200}" ) )
assertThat ( jscr . shell , hasItem ( containsString ( 'cf login -u "test_cf" -p \'********\' -a https://api.cf.eu10.hana.ondemand.com -o "testOrg" -s "testSpace"' ) ) )
2018-11-07 11:39:30 +02:00
assertThat ( jscr . shell , hasItem ( containsString ( "cf push testAppName -f 'test.yml'" ) ) )
2018-07-30 09:28:24 +02:00
}
@Test
void testCfNativeAppNameFromManifest ( ) {
helper . registerAllowedMethod ( 'fileExists' , [ String . class ] , { s - > return true } )
2018-10-17 11:01:09 +02:00
jryr . registerYaml ( 'test.yml' , "applications: [[name: 'manifestAppName']]" )
helper . registerAllowedMethod ( 'writeYaml' , [ Map ] , { Map parameters - >
generatedFile = parameters . file
data = parameters . data
} )
2018-07-30 09:28:24 +02:00
jsr . step . cloudFoundryDeploy ( [
script: nullScript ,
juStabUtils: utils ,
deployTool: 'cf_native' ,
cfOrg: 'testOrg' ,
cfSpace: 'testSpace' ,
cfCredentialsId: 'test_cfCredentialsId' ,
cfManifest: 'test.yml'
] )
2018-08-29 10:01:16 +02:00
// asserts
assertThat ( jscr . shell , hasItem ( containsString ( 'cf login -u "test_cf" -p \'********\' -a https://api.cf.eu10.hana.ondemand.com -o "testOrg" -s "testSpace"' ) ) )
2018-11-07 11:39:30 +02:00
assertThat ( jscr . shell , hasItem ( containsString ( "cf push -f 'test.yml'" ) ) )
2018-07-30 09:28:24 +02:00
}
@Test
void testCfNativeWithoutAppName ( ) {
helper . registerAllowedMethod ( 'fileExists' , [ String . class ] , { s - > return true } )
2018-09-04 09:44:34 +02:00
jryr . registerYaml ( 'test.yml' , "applications: [[]]" )
2018-10-17 11:01:09 +02:00
helper . registerAllowedMethod ( 'writeYaml' , [ Map ] , { Map parameters - >
generatedFile = parameters . file
data = parameters . data
} )
2018-07-30 09:28:24 +02:00
thrown . expect ( hudson . AbortException )
thrown . expectMessage ( '[cloudFoundryDeploy] ERROR: No appName available in manifest test.yml.' )
jsr . step . cloudFoundryDeploy ( [
script: nullScript ,
juStabUtils: utils ,
deployTool: 'cf_native' ,
cfOrg: 'testOrg' ,
cfSpace: 'testSpace' ,
cfCredentialsId: 'test_cfCredentialsId' ,
cfManifest: 'test.yml'
] )
}
2018-11-07 11:39:30 +02:00
@Test
void testCfNativeBlueGreen ( ) {
jryr . registerYaml ( 'test.yml' , "applications: [[]]" )
jsr . step . cloudFoundryDeploy ( [
script: nullScript ,
juStabUtils: utils ,
deployTool: 'cf_native' ,
deployType: 'blue-green' ,
cfOrg: 'testOrg' ,
cfSpace: 'testSpace' ,
cfCredentialsId: 'test_cfCredentialsId' ,
cfAppName: 'testAppName' ,
cfManifest: 'test.yml'
] )
assertThat ( jedr . dockerParams , hasEntry ( 'dockerImage' , 's4sdk/docker-cf-cli' ) )
assertThat ( jedr . dockerParams , hasEntry ( 'dockerWorkspace' , '/home/piper' ) )
assertThat ( jscr . shell , hasItem ( containsString ( 'cf login -u "test_cf" -p \'********\' -a https://api.cf.eu10.hana.ondemand.com -o "testOrg" -s "testSpace"' ) ) )
assertThat ( jscr . shell , hasItem ( containsString ( "cf blue-green-deploy testAppName --delete-old-apps -f 'test.yml'" ) ) )
}
@Test
void testCfNativeWithoutAppNameBlueGreen ( ) {
helper . registerAllowedMethod ( 'fileExists' , [ String . class ] , { s - > return true } )
jryr . registerYaml ( 'test.yml' , "applications: [[]]" )
thrown . expect ( hudson . AbortException )
thrown . expectMessage ( '[cloudFoundryDeploy] ERROR: Blue-green plugin requires app name to be passed (see https://github.com/bluemixgaragelondon/cf-blue-green-deploy/issues/27)' )
jsr . step . cloudFoundryDeploy ( [
script: nullScript ,
juStabUtils: utils ,
deployTool: 'cf_native' ,
deployType: 'blue-green' ,
cfOrg: 'testOrg' ,
cfSpace: 'testSpace' ,
cfCredentialsId: 'test_cfCredentialsId' ,
cfManifest: 'test.yml'
] )
}
2018-07-30 09:28:24 +02:00
@Test
void testMta ( ) {
jsr . step . cloudFoundryDeploy ( [
script: nullScript ,
juStabUtils: utils ,
cfOrg: 'testOrg' ,
cfSpace: 'testSpace' ,
cfCredentialsId: 'test_cfCredentialsId' ,
deployTool: 'mtaDeployPlugin' ,
mtaPath: 'target/test.mtar'
] )
2018-08-29 10:01:16 +02:00
// asserts
assertThat ( jedr . dockerParams , hasEntry ( 'dockerImage' , 's4sdk/docker-cf-cli' ) )
assertThat ( jedr . dockerParams , hasEntry ( 'dockerWorkspace' , '/home/piper' ) )
assertThat ( jscr . shell , hasItem ( containsString ( 'cf login -u test_cf -p \'********\' -a https://api.cf.eu10.hana.ondemand.com -o "testOrg" -s "testSpace"' ) ) )
assertThat ( jscr . shell , hasItem ( containsString ( 'cf deploy target/test.mtar -f' ) ) )
2018-07-30 09:28:24 +02:00
}
}