mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-14 11:03:09 +02:00
3c08a3bd7a
Co-authored-by: anilkeshav27 <you@example.com>
146 lines
4.5 KiB
Go
146 lines
4.5 KiB
Go
package generator
|
|
|
|
import (
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/SAP/jenkins-library/pkg/config"
|
|
)
|
|
|
|
func appendContextParameters(stepData *config.StepData) {
|
|
contextParameterNames := stepData.GetContextParameterFilters().All
|
|
if len(contextParameterNames) > 0 {
|
|
contextDetailsPath := "pkg/generator/helper/piper-context-defaults.yaml"
|
|
|
|
contextDetails := config.StepData{}
|
|
readContextInformation(contextDetailsPath, &contextDetails)
|
|
|
|
for _, contextParam := range contextDetails.Spec.Inputs.Parameters {
|
|
if contains(contextParameterNames, contextParam.Name) {
|
|
stepData.Spec.Inputs.Parameters = append(stepData.Spec.Inputs.Parameters, contextParam)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func consolidateContextDefaults(stepData *config.StepData) {
|
|
paramConditions := paramConditionDefaults{}
|
|
for _, container := range stepData.Spec.Containers {
|
|
containerParams := getContainerParameters(container, false)
|
|
if container.Conditions != nil && len(container.Conditions) > 0 {
|
|
for _, cond := range container.Conditions {
|
|
if cond.ConditionRef == "strings-equal" {
|
|
for _, condParam := range cond.Params {
|
|
for paramName, val := range containerParams {
|
|
if _, ok := paramConditions[paramName]; !ok {
|
|
paramConditions[paramName] = &conditionDefaults{}
|
|
}
|
|
paramConditions[paramName].equal = append(paramConditions[paramName].equal, conditionDefault{key: condParam.Name, value: condParam.Value, def: val})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
for paramName, val := range containerParams {
|
|
if _, ok := paramConditions[paramName]; !ok {
|
|
paramConditions[paramName] = &conditionDefaults{}
|
|
}
|
|
paramConditions[paramName].equal = append(paramConditions[paramName].equal, conditionDefault{def: val})
|
|
}
|
|
}
|
|
}
|
|
|
|
stashes := []interface{}{}
|
|
conditionalStashes := []conditionDefault{}
|
|
for _, res := range stepData.Spec.Inputs.Resources {
|
|
//consider only resources of type stash, others not relevant for conditions yet
|
|
if res.Type == "stash" {
|
|
if res.Conditions == nil || len(res.Conditions) == 0 {
|
|
stashes = append(stashes, res.Name)
|
|
} else {
|
|
for _, cond := range res.Conditions {
|
|
if cond.ConditionRef == "strings-equal" {
|
|
for _, condParam := range cond.Params {
|
|
conditionalStashes = append(conditionalStashes, conditionDefault{key: condParam.Name, value: condParam.Value, def: res.Name})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sortConditionalDefaults(conditionalStashes)
|
|
|
|
for _, conditionalStash := range conditionalStashes {
|
|
stashes = append(stashes, conditionalStash)
|
|
}
|
|
|
|
for key, param := range stepData.Spec.Inputs.Parameters {
|
|
if param.Name == "stashContent" {
|
|
stepData.Spec.Inputs.Parameters[key].Default = stashes
|
|
}
|
|
|
|
for containerParam, paramDefault := range paramConditions {
|
|
if param.Name == containerParam {
|
|
sortConditionalDefaults(paramConditions[param.Name].equal)
|
|
stepData.Spec.Inputs.Parameters[key].Default = paramDefault.equal
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func consolidateConditionalParameters(stepData *config.StepData) {
|
|
newParamList := []config.StepParameters{}
|
|
|
|
paramConditions := paramConditionDefaults{}
|
|
|
|
for _, param := range stepData.Spec.Inputs.Parameters {
|
|
if param.Conditions == nil || len(param.Conditions) == 0 {
|
|
newParamList = append(newParamList, param)
|
|
continue
|
|
}
|
|
|
|
if _, ok := paramConditions[param.Name]; !ok {
|
|
newParamList = append(newParamList, param)
|
|
paramConditions[param.Name] = &conditionDefaults{}
|
|
}
|
|
for _, cond := range param.Conditions {
|
|
if cond.ConditionRef == "strings-equal" {
|
|
for _, condParam := range cond.Params {
|
|
paramConditions[param.Name].equal = append(paramConditions[param.Name].equal, conditionDefault{key: condParam.Name, value: condParam.Value, def: param.Default})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for i, param := range newParamList {
|
|
if _, ok := paramConditions[param.Name]; ok {
|
|
newParamList[i].Conditions = nil
|
|
sortConditionalDefaults(paramConditions[param.Name].equal)
|
|
newParamList[i].Default = paramConditions[param.Name].equal
|
|
}
|
|
}
|
|
|
|
stepData.Spec.Inputs.Parameters = newParamList
|
|
}
|
|
|
|
func sortConditionalDefaults(conditionDefaults []conditionDefault) {
|
|
sort.SliceStable(conditionDefaults[:], func(i int, j int) bool {
|
|
keyLess := strings.Compare(conditionDefaults[i].key, conditionDefaults[j].key) < 0
|
|
valLess := strings.Compare(conditionDefaults[i].value, conditionDefaults[j].value) < 0
|
|
return keyLess || keyLess && valLess
|
|
})
|
|
}
|
|
|
|
type paramConditionDefaults map[string]*conditionDefaults
|
|
|
|
type conditionDefaults struct {
|
|
equal []conditionDefault
|
|
}
|
|
|
|
type conditionDefault struct {
|
|
key string
|
|
value string
|
|
def interface{}
|
|
}
|