Log errors coming from the language host (#1780)
* Log errors coming from the language host Similar to pulumi/pulumi#1762, fixes pulumi/pulumi#1775. The language host can fail without issuing any diagnostics and it is very unclear what happens if the engine does not log the error. * CR feedback
This commit is contained in:
parent
c924c18d2c
commit
d1524e1081
|
@ -1319,3 +1319,47 @@ func TestRefreshWithDelete(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests that errors returned directly from the language host get logged by the engine.
|
||||||
|
func TestLanguageHostDiagnostics(t *testing.T) {
|
||||||
|
loaders := []*deploytest.ProviderLoader{
|
||||||
|
deploytest.NewProviderLoader("pkgA", semver.MustParse("1.0.0"), func() (plugin.Provider, error) {
|
||||||
|
return &deploytest.Provider{}, nil
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
errorText := "oh no"
|
||||||
|
program := deploytest.NewLanguageRuntime(func(_ plugin.RunInfo, _ *deploytest.ResourceMonitor) error {
|
||||||
|
// Exiting immediately with an error simulates a language exiting immediately with a non-zero exit code.
|
||||||
|
return errors.New(errorText)
|
||||||
|
})
|
||||||
|
|
||||||
|
host := deploytest.NewPluginHost(nil, program, loaders...)
|
||||||
|
p := &TestPlan{
|
||||||
|
Options: UpdateOptions{host: host},
|
||||||
|
Steps: []TestStep{{
|
||||||
|
Op: Update,
|
||||||
|
ExpectFailure: true,
|
||||||
|
SkipPreview: true,
|
||||||
|
Validate: func(project workspace.Project, target deploy.Target, j *Journal, evts []Event, err error) error {
|
||||||
|
assert.Error(t, err)
|
||||||
|
sawExitCode := false
|
||||||
|
for _, evt := range evts {
|
||||||
|
if evt.Type == DiagEvent {
|
||||||
|
e := evt.Payload.(DiagEventPayload)
|
||||||
|
msg := colors.Never.Colorize(e.Message)
|
||||||
|
sawExitCode = strings.Contains(msg, errorText) && e.Severity == diag.Error
|
||||||
|
if sawExitCode {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.True(t, sawExitCode)
|
||||||
|
return err
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
|
||||||
|
p.Run(t, nil)
|
||||||
|
}
|
||||||
|
|
|
@ -120,6 +120,7 @@ outer:
|
||||||
if event.Error != nil {
|
if event.Error != nil {
|
||||||
logging.V(planExecutorLogLevel).Infof("PlanExecutor.Execute(...): saw incoming error: %v", event.Error)
|
logging.V(planExecutorLogLevel).Infof("PlanExecutor.Execute(...): saw incoming error: %v", event.Error)
|
||||||
pe.cancelDueToError()
|
pe.cancelDueToError()
|
||||||
|
pe.plan.Diag().Errorf(diag.RawMessage("" /*urn*/, event.Error.Error()))
|
||||||
break outer
|
break outer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue