in cmd/hub/lifecycle/invoke.go [21:116]
func Invoke(request *Request) {
stackManifest, componentsManifests, _, err := manifest.ParseManifest(request.ManifestFilenames)
if err != nil {
log.Fatalf("Unable to parse: %v", err)
}
additionalEnvironment, err := util.ParseKvList(request.EnvironmentOverrides)
if err != nil {
log.Fatalf("Unable to parse additional environment variables `%s`: %v", request.EnvironmentOverrides, err)
}
osEnv, err := initOsEnv(request.OsEnvironmentMode)
if err != nil {
log.Fatalf("Unable to parse OS environment setup: %v", err)
}
stateFiles, errs := storage.Check(request.StateFilenames, "state")
if len(errs) > 0 {
util.MaybeFatalf("Unable to check state file: %v", util.Errors2(errs...))
}
order, err := manifest.GenerateLifecycleOrder(stackManifest)
if err != nil {
log.Fatal(err)
}
stackManifest.Lifecycle.Order = order
stackBaseDir := util.Basedir(request.ManifestFilenames)
componentsBaseDir := request.ComponentsBaseDir
if componentsBaseDir == "" {
componentsBaseDir = stackBaseDir
}
manifest.CheckComponentsExist(stackManifest.Components, request.Component)
component := manifest.ComponentRefByName(stackManifest.Components, request.Component)
componentName := manifest.ComponentQualifiedNameFromRef(component)
componentManifest := manifest.ComponentManifestByRef(componentsManifests, component)
checkVerbs(request.Component, componentManifest.Lifecycle.Verbs, request.Verb)
stackParameters := make(parameters.LockedParameters)
outputs := make(parameters.CapturedOutputs)
_, err = state.MergeState(stateFiles,
request.Component, component.Depends, stackManifest.Lifecycle.Order, false,
stackParameters, outputs, nil)
if err != nil {
util.MaybeFatalf("Unable to load component `%s` state: %v",
request.Component, err)
}
if config.Verbose {
log.Printf("Invoke `%s` on `%s` with %v manifest and %v state",
request.Verb, request.Component, request.ManifestFilenames, request.StateFilenames)
}
// should we ask mergeState() to load true component parameters
// from state instead of re-evaluating them here?
expandedComponentParameters, errs := parameters.ExpandParameters(componentName, componentManifest.Meta.Kind, component.Depends,
stackParameters, outputs, manifest.FlattenParameters(componentManifest.Parameters, componentManifest.Meta.Name))
if len(errs) > 0 {
util.MaybeFatalf("Component `%s` parameters expansion failed:\n\t%s",
componentName, util.Errors("\n\t", errs...))
}
componentParameters := parameters.MergeParameters(make(parameters.LockedParameters), expandedComponentParameters)
if config.Debug {
log.Print("Component parameters:")
parameters.PrintLockedParameters(componentParameters)
}
dir := manifest.ComponentSourceDirFromRef(component, stackBaseDir, componentsBaseDir)
if config.Debug {
log.Printf("Component `%s` directory: %s", request.Component, dir)
}
impl, err := findImplementation(dir, request.Verb, componentManifest)
if err != nil {
log.Fatalf("Failed to %s %s: %v", request.Verb, request.Component, err)
}
processEnv := mergeOsEnviron(
parametersInEnv(component, componentParameters, stackBaseDir),
additionalEnvironmentToList(additionalEnvironment))
impl.Env = mergeOsEnviron(osEnv, processEnv)
if config.Debug && len(processEnv) > 0 {
log.Print("Component environment:")
printEnvironment(processEnv)
if config.Trace {
log.Print("Full process environment:")
printEnvironment(impl.Env)
}
}
_, _, err = execImplementation(impl, true, false)
if err != nil {
util.MaybeFatalf("Failed to %s %s: %v", request.Verb, request.Component, err)
}
}