Files
steampipe/pkg/pluginmanager_service/grpc/start_failure.go

46 lines
1.7 KiB
Go

package grpc
import (
"strings"
sdkplugin "github.com/turbot/steampipe-plugin-sdk/v5/plugin"
"github.com/turbot/steampipe-plugin-sdk/v5/sperr"
)
// HandleStartFailure is used to handle errors when starting both Steampipe plugins an dthe plugin manage
// (which is itself a GRPC plugin)
//
// When starting a GRPC plugin, a specific handshake sequence is expected on stdout.
// (This is automatically written in the case of a successfulty startup)
// If the handshae is missing (because the startup failed or anything else was written to stdout)
// we get the error "Unrecognized remote plugin message"
//
// If the plugin startup fails with an error panic, it constructs a message string
// starting with the prefix "Plugin startup failed: " , detailing the error.
//
// This function checks whether the error returned from startup is "Unrecognized remote plugin message",
// and if so, it looks for ""Plugin startup failed: " in the plugin message and if found,
// extracts the underlying error message. This is returnerd as an error
func HandleStartFailure(err error) error {
// extract the plugin message
_, pluginMessage, found := strings.Cut(err.Error(), sdkplugin.UnrecognizedRemotePluginMessage)
if !found {
return err
}
pluginMessage, _, found = strings.Cut(pluginMessage, sdkplugin.UnrecognizedRemotePluginMessageSuffix)
if !found {
return err
}
// if this was an error during startup, reraise an error with the error string
_, pluginError, found := strings.Cut(pluginMessage, sdkplugin.PluginStartupFailureMessage)
if !found {
return err
}
if strings.Contains(pluginMessage, sdkplugin.PluginStartupFailureMessage) {
return sperr.New("%s", pluginError)
}
return err
}