mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-14 11:03:09 +02:00
Merge remote-tracking branch 'github/master' into HEAD
This commit is contained in:
commit
1a907a834d
@ -6,6 +6,8 @@ import com.sap.piper.GenerateDocumentation
|
|||||||
import java.util.regex.Matcher
|
import java.util.regex.Matcher
|
||||||
import groovy.text.StreamingTemplateEngine
|
import groovy.text.StreamingTemplateEngine
|
||||||
|
|
||||||
|
import com.sap.piper.MapUtils
|
||||||
|
|
||||||
//
|
//
|
||||||
// Collects helper functions for rendering the documentation
|
// Collects helper functions for rendering the documentation
|
||||||
//
|
//
|
||||||
@ -375,13 +377,6 @@ class Helper {
|
|||||||
return mappings
|
return mappings
|
||||||
}
|
}
|
||||||
|
|
||||||
static getValue(Map config, def pPath) {
|
|
||||||
def p =config[pPath.head()]
|
|
||||||
if(pPath.size() == 1) return p // there is no tail
|
|
||||||
if(p in Map) getValue(p, pPath.tail())
|
|
||||||
else return p
|
|
||||||
}
|
|
||||||
|
|
||||||
static resolveDocuRelevantSteps(GroovyScriptEngine gse, File stepsDir) {
|
static resolveDocuRelevantSteps(GroovyScriptEngine gse, File stepsDir) {
|
||||||
|
|
||||||
def docuRelevantSteps = []
|
def docuRelevantSteps = []
|
||||||
@ -640,7 +635,7 @@ def handleStep(stepName, prepareDefaultValuesStep, gse, customDefaults) {
|
|||||||
|
|
||||||
it ->
|
it ->
|
||||||
|
|
||||||
def defaultValue = Helper.getValue(defaultConfig, it.split('/'))
|
def defaultValue = MapUtils.getByPath(defaultConfig, it)
|
||||||
|
|
||||||
def parameterProperties = [
|
def parameterProperties = [
|
||||||
defaultValue: defaultValue,
|
defaultValue: defaultValue,
|
||||||
@ -675,7 +670,7 @@ def handleStep(stepName, prepareDefaultValuesStep, gse, customDefaults) {
|
|||||||
[
|
[
|
||||||
dependentParameterKey: dependentParameterKey,
|
dependentParameterKey: dependentParameterKey,
|
||||||
key: possibleValue,
|
key: possibleValue,
|
||||||
value: Helper.getValue(defaultConfig.get(possibleValue), k.split('/'))
|
value: MapUtils.getByPath(defaultConfig.get(possibleValue), k)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,9 +127,11 @@ class ConfigurationHelper implements Serializable {
|
|||||||
handleValidationFailures()
|
handleValidationFailures()
|
||||||
MapUtils.traverse(config, { v -> (v instanceof GString) ? v.toString() : v })
|
MapUtils.traverse(config, { v -> (v instanceof GString) ? v.toString() : v })
|
||||||
if(config.verbose) step.echo "[${name}] Configuration: ${config}"
|
if(config.verbose) step.echo "[${name}] Configuration: ${config}"
|
||||||
return config
|
return MapUtils.deepCopy(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* private */ def getConfigPropertyNested(key) {
|
/* private */ def getConfigPropertyNested(key) {
|
||||||
return getConfigPropertyNested(config, key)
|
return getConfigPropertyNested(config, key)
|
||||||
}
|
}
|
||||||
|
@ -62,4 +62,56 @@ class MapUtils implements Serializable {
|
|||||||
}
|
}
|
||||||
m.putAll(updates)
|
m.putAll(updates)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static private def getByPath(Map m, def key) {
|
||||||
|
List path = key in CharSequence ? key.tokenize('/') : key
|
||||||
|
|
||||||
|
def value = m.get(path.head())
|
||||||
|
|
||||||
|
if (path.size() == 1) return value
|
||||||
|
if (value in Map) return getByPath(value, path.tail())
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Provides a new map with the same content like the original map.
|
||||||
|
* Nested Collections and Maps are copied. Values with are not
|
||||||
|
* Collections/Maps are not copied/cloned.
|
||||||
|
* <paranoia>&/ltThe keys are also not copied/cloned, even if they are
|
||||||
|
* Maps or Collections;paranoia>
|
||||||
|
*/
|
||||||
|
static deepCopy(Map original) {
|
||||||
|
Map copy = [:]
|
||||||
|
for (def e : original.entrySet()) {
|
||||||
|
if(e.value == null) {
|
||||||
|
copy.put(e.key, e.value)
|
||||||
|
} else {
|
||||||
|
copy.put(e.key, deepCopy(e.value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
copy
|
||||||
|
}
|
||||||
|
|
||||||
|
/* private */ static deepCopy(Set original) {
|
||||||
|
Set copy = []
|
||||||
|
for(def e : original)
|
||||||
|
copy << deepCopy(e)
|
||||||
|
copy
|
||||||
|
}
|
||||||
|
|
||||||
|
/* private */ static deepCopy(List original) {
|
||||||
|
List copy = []
|
||||||
|
for(def e : original)
|
||||||
|
copy << deepCopy(e)
|
||||||
|
copy
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In fact not a copy, but a catch all for everything not matching
|
||||||
|
* with the other signatures
|
||||||
|
*/
|
||||||
|
/* private */ static deepCopy(def original) {
|
||||||
|
original
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,9 @@ package com.sap.piper
|
|||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.is
|
||||||
|
import static org.junit.Assert.assertThat
|
||||||
|
|
||||||
class MapUtilsTest {
|
class MapUtilsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -50,4 +53,44 @@ class MapUtilsTest {
|
|||||||
MapUtils.traverse(m, { s -> (s.startsWith('x')) ? "replaced" : s})
|
MapUtils.traverse(m, { s -> (s.startsWith('x')) ? "replaced" : s})
|
||||||
assert m == [a: 'replaced', m: [b: 'replaced', c: 'otherString']]
|
assert m == [a: 'replaced', m: [b: 'replaced', c: 'otherString']]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testGetByPath() {
|
||||||
|
Map m = [trees: [oak: 5, beech :1], flowers:[rose: 23]]
|
||||||
|
|
||||||
|
assertThat(MapUtils.getByPath(m, 'flowers'), is([rose: 23]))
|
||||||
|
assertThat(MapUtils.getByPath(m, 'trees/oak'), is(5))
|
||||||
|
assertThat(MapUtils.getByPath(m, 'trees/palm'), is(null))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testDeepCopy() {
|
||||||
|
|
||||||
|
List l = ['a', 'b', 'c']
|
||||||
|
|
||||||
|
def original = [
|
||||||
|
list: l,
|
||||||
|
set: (Set)['1', '2'],
|
||||||
|
nextLevel: [
|
||||||
|
list: ['x', 'y'],
|
||||||
|
duplicate: l,
|
||||||
|
set: (Set)[9, 8, 7]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
def copy = MapUtils.deepCopy(original)
|
||||||
|
|
||||||
|
assert ! copy.is(original)
|
||||||
|
assert ! copy.list.is(original.list)
|
||||||
|
assert ! copy.set.is(original.set)
|
||||||
|
assert ! copy.nextLevel.list.is(original.nextLevel.list)
|
||||||
|
assert ! copy.nextLevel.set.is(original.nextLevel.set)
|
||||||
|
assert ! copy.nextLevel.duplicate.is(original.nextLevel.duplicate)
|
||||||
|
|
||||||
|
// Within the original identical list is used twice, but the
|
||||||
|
// assuption is that there are different lists in the copy.
|
||||||
|
assert ! copy.nextLevel.duplicate.is(copy.list)
|
||||||
|
|
||||||
|
assert copy == original
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -451,27 +451,4 @@ steps: {}
|
|||||||
assertThat(nullScript.commonPipelineEnvironment.configuration.runStage.Acceptance, is(true))
|
assertThat(nullScript.commonPipelineEnvironment.configuration.runStage.Acceptance, is(true))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
void testGetConfigValue() {
|
|
||||||
|
|
||||||
def config = [
|
|
||||||
invalidKey: 'invalidValue',
|
|
||||||
stringKey: 'stringValue',
|
|
||||||
listKey: [
|
|
||||||
'listValue1',
|
|
||||||
'listValue2'
|
|
||||||
],
|
|
||||||
nested: [
|
|
||||||
key: 'nestedValue'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
|
|
||||||
assertThat(jsr.step.piperInitRunStageConfiguration.getConfigValue(config, 'stringKey'), is('stringValue'))
|
|
||||||
assertThat(jsr.step.piperInitRunStageConfiguration.getConfigValue(config, 'listKey'), is(['listValue1','listValue2']))
|
|
||||||
assertThat(jsr.step.piperInitRunStageConfiguration.getConfigValue(config, 'nested/key'), is('nestedValue'))
|
|
||||||
assertThat(jsr.step.piperInitRunStageConfiguration.getConfigValue(config, 'invalidKey/key'), is(nullValue()))
|
|
||||||
|
|
||||||
//assertThat(jsr.step.piperInitRunStageConfiguration.getConfigValue(config, 'nested/key'), is('nestedValue'))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ import com.sap.piper.ConfigurationLoader
|
|||||||
import static com.sap.piper.Prerequisites.checkScript
|
import static com.sap.piper.Prerequisites.checkScript
|
||||||
|
|
||||||
import com.sap.piper.ConfigurationHelper
|
import com.sap.piper.ConfigurationHelper
|
||||||
|
import com.sap.piper.MapUtils
|
||||||
import groovy.transform.Field
|
import groovy.transform.Field
|
||||||
|
|
||||||
@Field String STEP_NAME = getClass().getName()
|
@Field String STEP_NAME = getClass().getName()
|
||||||
@ -65,27 +66,27 @@ void call(Map parameters = [:]) {
|
|||||||
case 'config':
|
case 'config':
|
||||||
if (condition.getValue() instanceof Map) {
|
if (condition.getValue() instanceof Map) {
|
||||||
condition.getValue().each {configCondition ->
|
condition.getValue().each {configCondition ->
|
||||||
if (getConfigValue(stepConfig, configCondition.getKey()) in configCondition.getValue()) {
|
if (MapUtils.getByPath(stepConfig, configCondition.getKey()) in configCondition.getValue()) {
|
||||||
stepActive = true
|
stepActive = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (getConfigValue(stepConfig, condition.getValue())) {
|
} else if (MapUtils.getByPath(stepConfig, condition.getValue())) {
|
||||||
stepActive = true
|
stepActive = true
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'configKeys':
|
case 'configKeys':
|
||||||
if (condition.getValue() instanceof List) {
|
if (condition.getValue() instanceof List) {
|
||||||
condition.getValue().each {configKey ->
|
condition.getValue().each {configKey ->
|
||||||
if (getConfigValue(stepConfig, configKey)) {
|
if (MapUtils.getByPath(stepConfig, configKey)) {
|
||||||
stepActive = true
|
stepActive = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (getConfigValue(stepConfig, condition.getValue())) {
|
} else if (MapUtils.getByPath(stepConfig, condition.getValue())) {
|
||||||
stepActive = true
|
stepActive = true
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'filePatternFromConfig':
|
case 'filePatternFromConfig':
|
||||||
def conditionValue = getConfigValue(stepConfig, condition.getValue())
|
def conditionValue = MapUtils.getByPath(stepConfig, condition.getValue())
|
||||||
if (conditionValue && findFiles(glob: conditionValue)) {
|
if (conditionValue && findFiles(glob: conditionValue)) {
|
||||||
stepActive = true
|
stepActive = true
|
||||||
}
|
}
|
||||||
@ -110,16 +111,3 @@ void call(Map parameters = [:]) {
|
|||||||
echo "[${STEP_NAME}] Debug - Run Step Configuration: ${script.commonPipelineEnvironment.configuration.runStep}"
|
echo "[${STEP_NAME}] Debug - Run Step Configuration: ${script.commonPipelineEnvironment.configuration.runStep}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private def getConfigValue(Map stepConfig, def configKey) {
|
|
||||||
if (stepConfig == null) return null
|
|
||||||
|
|
||||||
List configPath = configKey instanceof String ? configKey.tokenize('/') : configKey
|
|
||||||
|
|
||||||
def configValue = stepConfig[configPath.head()]
|
|
||||||
|
|
||||||
if (configPath.size() == 1) return configValue
|
|
||||||
if (configValue in Map) return getConfigValue(configValue, configPath.tail())
|
|
||||||
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user