in cmd/hub/parameters/eval.go [255:327]
func ExpandParameters(componentName, componentKind string, componentDepends []string,
parameters LockedParameters, outputs CapturedOutputs,
componentParameters []manifest.Parameter) ([]LockedParameter, []error) {
// make outputs of the same component kind invisible
outputFilter := func(output CapturedOutput) bool {
return !(componentKind != "" && componentKind == output.ComponentKind)
}
kv := ParametersAndOutputsKV(parameters, outputs, outputFilter)
kv["hub.componentName"] = componentName
// expand, check for cycles
expanded := make([]LockedParameter, 0, len(componentParameters)+3)
expanded = append(expanded, LockedParameter{Name: "hub.componentName", Value: componentName})
errs := make([]error, 0)
for _, parameter := range componentParameters {
fqName := parameterQualifiedName(parameter.Name, componentName)
v, exist := FindValue(parameter.Name, componentName, componentDepends, kv)
if exist {
parameter.Value = v
if RequireExpansion(parameter.Value) {
errs = append(errs, ExpandParameter(¶meter, componentDepends, kv)...)
}
} else {
if parameter.Kind == "user" {
util.Warn("Component `%s` user-level parameter `%s` must be propagated to stack level parameter",
componentName, fqName)
}
if util.Empty(parameter.Value) && !util.Empty(parameter.Default) {
parameter.Value = parameter.Default
}
if util.Empty(parameter.Value) {
if parameter.Empty == "allow" {
if config.Debug {
log.Printf("Empty parameter `%s` value allowed", fqName)
}
parameter.Value = ""
} else {
errs = append(errs, fmt.Errorf("Parameter `%s` value cannot be derived from stack parameters nor outputs", fqName))
parameter.Value = "(unknown)"
}
} else {
if RequireExpansion(parameter.Value) {
errs = append(errs, ExpandParameter(¶meter, componentDepends, kv)...)
}
}
}
if config.Trace {
log.Printf("--- %s | %s => %v", parameter.Name, componentName, parameter.Value)
}
expanded = append(expanded, LockedParameter{Name: parameter.Name, Value: parameter.Value, Env: parameter.Env})
kv[parameter.Name] = parameter.Value
}
if config.Trace && len(expanded) > 1 {
log.Print("Parameters expanded:")
PrintLockedParametersList(expanded)
}
if len(errs) > 0 && !config.Force {
if !config.Trace {
log.Print("Parameters expanded:")
PrintLockedParametersList(expanded)
}
log.Print("Currently known stack parameters:")
PrintLockedParameters(parameters)
if len(outputs) > 0 {
log.Print("Currently known outputs:")
PrintCapturedOutputs(outputs)
}
}
return expanded, errs
}