in cmd/hub/compose/elaborate.go [152:274]
func elaborate(manifestFilename string, parametersFilenames []string, overrides map[string]string,
wellKnown map[string]manifest.Parameter, componentsBaseDir string,
excludedComponents []string, depth int,
maybeExtraParameters func(manifest.Manifest) []manifest.Parameter) (*manifest.Manifest, []manifest.Manifest) {
stackManifest := parseManifest(manifestFilename)
order, err := manifest.GenerateLifecycleOrder(stackManifest)
if err != nil {
log.Fatal(err)
}
stackManifest.Lifecycle.Order = order
parametersManifests, parametersFilenamesRead := parseParameters(parametersFilenames)
stackBaseDir := util.StripDotDirs(filepath.Dir(manifestFilename))
componentsBaseDirCurrent := componentsBaseDir
if componentsBaseDirCurrent == "" {
componentsBaseDirCurrent = stackBaseDir
}
if config.Debug {
log.Printf("Base directory for sources is `%s`", componentsBaseDirCurrent)
}
componentsManifests, err := manifest.ParseComponentsManifestsWithExclusion(stackManifest.Components, excludedComponents,
stackBaseDir, componentsBaseDirCurrent)
if err != nil {
log.Fatalf("Unable to load component manifest refered from `%s`: %v", manifestFilename, err)
}
checkComponentsNames(stackManifest.Components)
checkLifecycle(stackManifest.Components, stackManifest.Lifecycle)
isApplication := stackManifest.Kind == "application"
fromStack := stackManifest.Meta.FromStack != ""
fromStackName := ""
fromStackManifest := &manifest.Manifest{}
var fromStackComponentsManifests []manifest.Manifest
if fromStack {
if isApplication {
log.Fatalf("Application manifest %s cannot use `fromStack`", manifestFilename)
}
fromStackName = filepath.Base(stackManifest.Meta.FromStack)
fromStackFilename := filepath.Join(stackManifest.Meta.FromStack, "hub.yaml")
fromStackParams := scanParamsFiles(stackManifest.Meta.FromStack)
fromStackExcludedComponents := append(excludedComponents, manifest.ComponentsNamesFromRefs(stackManifest.Components)...)
fromStackManifest, fromStackComponentsManifests = elaborate(fromStackFilename, fromStackParams, overrides,
wellKnown, componentsBaseDir, fromStackExcludedComponents, depth+1, nil)
}
if config.Verbose {
components := "with no sub-components"
if len(stackManifest.Components) > 0 {
components = fmt.Sprintf("with components: %s", strings.Join(stackManifest.Lifecycle.Order, ", "))
}
log.Printf("*** %s %s %s", cases.Title(language.Und).String(stackManifest.Kind), stackManifest.Meta.Name,
components)
}
parameters := unwrapComponentsParameters(componentsManifests)
checkParameters(parameters)
if fromStack {
parameters = append(parameters, fromStackManifest.Parameters) // already flat
}
manifestsParameters := [][]manifest.Parameter{
manifest.FlattenParameters(stackManifest.Parameters, fmt.Sprintf("%s [%s]", stackManifest.Meta.Name, manifestFilename)),
}
manifestsParameters = append(manifestsParameters, unwrapManifestsParameters(parametersManifests, parametersFilenamesRead)...)
checkParameters(manifestsParameters)
var elaborated manifest.Manifest
nComponents := len(componentsManifests)
elaborated.Version = stackManifest.Version
elaborated.Kind = stackManifest.Kind
elaborated.Meta = stackManifest.Meta
elaborated.Meta.FromStack = ""
if fromStack {
elaborated.Meta.Annotations = mergeAnnotations(fromStackManifest.Meta.Annotations, stackManifest.Meta.Annotations)
parentBaseDir := stackManifest.Meta.FromStack
parentComponentsBaseDir := componentsBaseDir
if parentComponentsBaseDir == "" {
parentComponentsBaseDir = parentBaseDir
}
elaborated.Components = mergeComponentsRefs(parentBaseDir, parentComponentsBaseDir,
fromStackManifest.Components, stackManifest.Components)
elaborated.Lifecycle = mergeLifecycle(fromStackManifest.Lifecycle, stackManifest.Lifecycle)
elaborated.Outputs = mergeOutputs(fromStackManifest.Outputs, stackManifest.Outputs)
componentsManifests = mergeComponentsManifests(fromStackComponentsManifests, componentsManifests)
elaborated.Platform.Provides = util.MergeUnique(fromStackManifest.Platform.Provides, stackManifest.Platform.Provides)
} else {
elaborated.Components = stackManifest.Components
elaborated.Lifecycle = stackManifest.Lifecycle
elaborated.Outputs = stackManifest.Outputs
elaborated.Platform.Provides = stackManifest.Platform.Provides
}
parametersManifestsOutputs := unwrapManifestsOutputs(parametersManifests)
if len(parametersManifestsOutputs) > 0 {
elaborated.Outputs = mergeOutputs(elaborated.Outputs, parametersManifestsOutputs)
}
if isApplication {
elaborated.Templates = stackManifest.Templates
}
stackRequires := connectRequires(fromStackName, fromStackManifest.Provides,
stackManifest.Requires, componentsManifests, stackManifest.Lifecycle.Order)
elaborated.Requires = mergeRequires(fromStackManifest.Requires, stackRequires)
elaborated.Provides = mergeProvides(fromStackName, fromStackManifest.Provides,
stackManifest.Provides, componentsManifests)
if maybeExtraParameters != nil {
extra := maybeExtraParameters(elaborated)
if len(extra) > 0 {
parameters = append(parameters, extra)
}
}
parameters = append(parameters, manifestsParameters...)
elaborated.Parameters = mergeParameters(parameters, overrides, wellKnown,
manifest.ComponentsNamesFromRefs(elaborated.Components), nComponents, isApplication)
return &elaborated, componentsManifests
}