Wire load lifecycle through input acquisition
This commit is contained in:
@@ -79,16 +79,14 @@ func loadGroupedWithSecretLookup[T any](request loadRequest[T], secrets SecretBi
|
||||
return executeLoadRequest(request, secrets, lookup)
|
||||
}
|
||||
|
||||
func assembleLayeredInput[T any](request loadRequest[T], input assembledInput, accounting *importAccounting) (assembledInput, []Diagnostic) {
|
||||
func assembleLayeredInput[T any](request loadRequest[T], input assembledInput, policy acquisitionPolicy, state *acquisitionState) (assembledInput, []Diagnostic) {
|
||||
var assembly *assemblyAccumulator
|
||||
mainSourceCount := len(input.sources)
|
||||
mainEvidence := input.versionState.evidenceSince(0)
|
||||
projectVersion := sequenceVersionPath(request.protectionVersion())
|
||||
for index, group := range request.underlays {
|
||||
evidenceStart := len(input.versionState.evidenceSince(0))
|
||||
acquired, diagnostics := acquireUnderlayGroupScopes(group, index+1, request.protectionVersion(), accounting, input.versionState, acquisitionPolicy{
|
||||
importDefaults: request.importDefaults, sequencePolicy: request.sequencePolicy, importLimits: defaultImportLimits(),
|
||||
})
|
||||
acquired, diagnostics := acquireUnderlayGroupScopes(group, index+1, request.protectionVersion(), state, policy)
|
||||
mergeResourceContexts(&input.contexts, acquired.contexts)
|
||||
if len(diagnostics) != 0 {
|
||||
input.sources = append(input.sources, acquired.sources...)
|
||||
@@ -104,7 +102,7 @@ func assembleLayeredInput[T any](request loadRequest[T], input assembledInput, a
|
||||
// Source-local checks still run during acquisition above.
|
||||
protectionRule = nil
|
||||
}
|
||||
composition, diagnostics := composeUnderlayGroup(acquired, protectionRule, request.sequencePolicy, lower)
|
||||
composition, diagnostics := composeUnderlayGroup(acquired, protectionRule, policy.sequencePolicy, lower)
|
||||
sourceStart := len(input.sources)
|
||||
input.sources = append(input.sources, acquired.sources...)
|
||||
if len(diagnostics) != 0 {
|
||||
@@ -120,7 +118,7 @@ func assembleLayeredInput[T any](request loadRequest[T], input assembledInput, a
|
||||
}
|
||||
operations, diagnostics := assembly.applyOverlayWithCollectionProjection(
|
||||
composition.root, composition.origins, composition.collectionPolicies, composition.applications, LayerUnderlay,
|
||||
request.sequencePolicy, declarations,
|
||||
policy.sequencePolicy, declarations,
|
||||
)
|
||||
if len(diagnostics) != 0 {
|
||||
return input, diagnostics
|
||||
@@ -138,7 +136,7 @@ func assembleLayeredInput[T any](request loadRequest[T], input assembledInput, a
|
||||
lower = assembly.current.collectionPolicies
|
||||
}
|
||||
var diagnostics []Diagnostic
|
||||
mainComposition, diagnostics = compositionForInputWithPolicies(input, lower, request.sequencePolicy)
|
||||
mainComposition, diagnostics = compositionForInputWithPolicies(input, lower, policy.sequencePolicy)
|
||||
if len(diagnostics) != 0 {
|
||||
return input, diagnostics
|
||||
}
|
||||
@@ -167,7 +165,7 @@ func assembleLayeredInput[T any](request loadRequest[T], input assembledInput, a
|
||||
}
|
||||
operations, diagnostics := assembly.applyOverlayWithCollectionProjection(
|
||||
mainComposition.root, mainComposition.origins, mainComposition.collectionPolicies, mainComposition.applications, LayerBase,
|
||||
request.sequencePolicy, declarations,
|
||||
policy.sequencePolicy, declarations,
|
||||
)
|
||||
if len(diagnostics) != 0 {
|
||||
return input, append(versionDiagnostics, diagnostics...)
|
||||
@@ -191,15 +189,15 @@ func assembleLayeredInput[T any](request loadRequest[T], input assembledInput, a
|
||||
if assembly == nil {
|
||||
return input, versionDiagnostics
|
||||
}
|
||||
assembly.current.inputBytes = accounting.bytes
|
||||
assembly.current.inputNodes = accounting.nodes
|
||||
assembly.current.inputBytes = state.accounting.bytes
|
||||
assembly.current.inputNodes = state.accounting.nodes
|
||||
if activeOverlay(request.overlay) {
|
||||
// The selected overlay context is independent of the main input. This
|
||||
// synthetic descriptor creates no source record or input contribution.
|
||||
selection := Source{kind: sourceBytes}
|
||||
selected := parsedSource{document: &document.Node{Kind: document.Mapping}, source: &SourceInfo{}}
|
||||
var diagnostics []Diagnostic
|
||||
overlayPolicy := []sequencePolicy{request.sequencePolicy}
|
||||
overlayPolicy := []sequencePolicy{policy.sequencePolicy}
|
||||
input.sources, diagnostics = loadSelectedOverlayIntoWithVersion(selection, request.overlayFilesystem, selected, assembly, input.sources, request.overlay, request.protectionVersion(), defaultImportLimits(), input.versionState, overlayPolicy...)
|
||||
if len(diagnostics) != 0 {
|
||||
return input, append(versionDiagnostics, diagnostics...)
|
||||
@@ -215,10 +213,9 @@ func assembleLayeredInput[T any](request loadRequest[T], input assembledInput, a
|
||||
return input, versionDiagnostics
|
||||
}
|
||||
|
||||
func acquireUnderlayGroupScopes(group loadGroup, index int, rule *VersionRule, accounting *importAccounting, versionState *sourceVersionState, policy acquisitionPolicy) (*acquiredUnderlayGroup, []Diagnostic) {
|
||||
initialBytes, initialNodes := accounting.bytes, accounting.nodes
|
||||
visited := make(map[resourceIdentity]importRoute)
|
||||
hostToken := &namespaceToken{}
|
||||
func acquireUnderlayGroupScopes(group loadGroup, index int, rule *VersionRule, state *acquisitionState, policy acquisitionPolicy) (*acquiredUnderlayGroup, []Diagnostic) {
|
||||
initialBytes, initialNodes := state.accounting.bytes, state.accounting.nodes
|
||||
tier := &tierAcquisitionState{visited: make(map[resourceIdentity]importRoute), hostToken: &namespaceToken{}}
|
||||
nativeAnchors := make(map[*namespaceToken]string)
|
||||
for inputIndex, contribution := range group.inputs {
|
||||
if token := nativeTokenForLoadInput(contribution); token != nil {
|
||||
@@ -230,14 +227,10 @@ func acquireUnderlayGroupScopes(group loadGroup, index int, rule *VersionRule, a
|
||||
acquiredGroup := &acquiredUnderlayGroup{index: index}
|
||||
inclusionGraph := newImportInclusionGraph()
|
||||
for inputIndex, contribution := range group.inputs {
|
||||
options := Options[struct{}]{
|
||||
Imports: contribution.imports, Filesystem: contribution.filesystem,
|
||||
Definition: Definition[struct{}]{Version: rule}, destination: contribution.destination.clone(),
|
||||
placementMode: contribution.placementMode, sequencePolicy: policy.sequencePolicy, deferAssembly: true,
|
||||
directiveContext: rootDirectiveContextLayered,
|
||||
importDefaults: snapshotImportDefaults(policy.importDefaults),
|
||||
}
|
||||
acquired, diagnostics := assembleBaseInputTrackedForRole(contribution.source, options, contribution.destination, accounting, visited, hostToken, versionState, sourceVersionContribution)
|
||||
acquired, diagnostics := acquireInput(inputAcquisitionRequest{
|
||||
input: contribution, role: sourceVersionContribution,
|
||||
directiveContext: rootDirectiveContextLayered, protectionRule: rule, deferAssembly: true,
|
||||
}, policy, state, tier)
|
||||
for _, source := range acquired.sources {
|
||||
source.Layer = LayerUnderlay
|
||||
source.UnderlayIndex = index
|
||||
@@ -271,8 +264,8 @@ func acquireUnderlayGroupScopes(group loadGroup, index int, rule *VersionRule, a
|
||||
mergeImportInclusionGraph(&inclusionGraph, inputGraph)
|
||||
}
|
||||
acquiredGroup.importGraph = inclusionGraph.clone()
|
||||
acquiredGroup.inputBytes = accounting.bytes - initialBytes
|
||||
acquiredGroup.inputNodes = accounting.nodes - initialNodes
|
||||
acquiredGroup.inputBytes = state.accounting.bytes - initialBytes
|
||||
acquiredGroup.inputNodes = state.accounting.nodes - initialNodes
|
||||
return acquiredGroup, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user