github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/pkg/packager/creator/compose.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // SPDX-FileCopyrightText: 2021-Present The Jackal Authors
     3  
     4  // Package creator contains functions for creating Jackal packages.
     5  package creator
     6  
     7  import (
     8  	"github.com/Racer159/jackal/src/pkg/message"
     9  	"github.com/Racer159/jackal/src/pkg/packager/composer"
    10  	"github.com/Racer159/jackal/src/types"
    11  )
    12  
    13  // ComposeComponents composes components and their dependencies into a single Jackal package using an import chain.
    14  func ComposeComponents(pkg types.JackalPackage, flavor string) (types.JackalPackage, []string, error) {
    15  	components := []types.JackalComponent{}
    16  	warnings := []string{}
    17  
    18  	pkgVars := pkg.Variables
    19  	pkgConsts := pkg.Constants
    20  
    21  	arch := pkg.Metadata.Architecture
    22  
    23  	for i, component := range pkg.Components {
    24  		// filter by architecture and flavor
    25  		if !composer.CompatibleComponent(component, arch, flavor) {
    26  			continue
    27  		}
    28  
    29  		// if a match was found, strip flavor and architecture to reduce bloat in the package definition
    30  		component.Only.Cluster.Architecture = ""
    31  		component.Only.Flavor = ""
    32  
    33  		// build the import chain
    34  		chain, err := composer.NewImportChain(component, i, pkg.Metadata.Name, arch, flavor)
    35  		if err != nil {
    36  			return types.JackalPackage{}, nil, err
    37  		}
    38  		message.Debugf("%s", chain)
    39  
    40  		// migrate any deprecated component configurations now
    41  		warning := chain.Migrate(pkg.Build)
    42  		warnings = append(warnings, warning...)
    43  
    44  		// get the composed component
    45  		composed, err := chain.Compose()
    46  		if err != nil {
    47  			return types.JackalPackage{}, nil, err
    48  		}
    49  		components = append(components, *composed)
    50  
    51  		// merge variables and constants
    52  		pkgVars = chain.MergeVariables(pkgVars)
    53  		pkgConsts = chain.MergeConstants(pkgConsts)
    54  	}
    55  
    56  	// set the filtered + composed components
    57  	pkg.Components = components
    58  
    59  	pkg.Variables = pkgVars
    60  	pkg.Constants = pkgConsts
    61  
    62  	return pkg, warnings, nil
    63  }