Make workspace loading async. Closes #3123

This commit is contained in:
Binaek Sarkar
2023-02-20 22:48:33 +05:30
committed by GitHub
parent d5dea57a5e
commit c896d88e88
9 changed files with 110 additions and 93 deletions

View File

@@ -21,11 +21,6 @@ import (
)
type InitData struct {
// the current state that init is in
Status string
// if non-nil, this is called everytime the status changes
OnStatusChanged func(string)
Workspace *workspace.Workspace
Client db_common.Client
Result *db_common.InitResult
@@ -37,22 +32,14 @@ type InitData struct {
ExportManager *export.Manager
}
func (i *InitData) SetStatus(newStatus string) {
i.Status = newStatus
if i.OnStatusChanged != nil {
i.OnStatusChanged(newStatus)
}
}
func NewErrorInitData(err error) *InitData {
return &InitData{
Result: &db_common.InitResult{Error: err},
}
}
func NewInitData(w *workspace.Workspace) *InitData {
func NewInitData() *InitData {
i := &InitData{
Workspace: w,
Result: &db_common.InitResult{},
ExportManager: export.NewManager(),
}
@@ -68,11 +55,7 @@ func (i *InitData) RegisterExporters(exporters ...export.Exporter) *InitData {
return i
}
func (i *InitData) Init(parentCtx context.Context, invoker constants.Invoker) (res *InitData) {
// create a context with the init hook in - which can be sent down to lower level operations
hook := NewInitStatusHook(i)
ctx := statushooks.AddStatusHooksToContext(parentCtx, hook)
func (i *InitData) Init(ctx context.Context, invoker constants.Invoker) {
defer func() {
if r := recover(); r != nil {
i.Result.Error = helpers.ToError(r)
@@ -82,10 +65,8 @@ func (i *InitData) Init(parentCtx context.Context, invoker constants.Invoker) (r
i.Result.Error = ctx.Err()
}
}()
// return ourselves
res = i
i.SetStatus("Initializing")
statushooks.SetStatus(ctx, "Initializing")
// initialise telemetry
shutdownTelemetry, err := telemetry.Init(constants.AppName)
@@ -97,7 +78,7 @@ func (i *InitData) Init(parentCtx context.Context, invoker constants.Invoker) (r
// install mod dependencies if needed
if viper.GetBool(constants.ArgModInstall) {
i.SetStatus("Installing workspace dependencies")
statushooks.SetStatus(ctx, "Installing workspace dependencies")
opts := &modinstaller.InstallOpts{WorkspacePath: viper.GetString(constants.ArgModLocation)}
_, err := modinstaller.InstallWorkspaceDependencies(opts)
if err != nil {
@@ -116,7 +97,7 @@ func (i *InitData) Init(parentCtx context.Context, invoker constants.Invoker) (r
// set cloud metadata (may be nil)
i.Workspace.CloudMetadata = cloudMetadata
i.SetStatus("Checking for required plugins")
statushooks.SetStatus(ctx, "Checking for required plugins")
// check if the required plugins are installed
err = i.Workspace.CheckRequiredPluginsInstalled()
if err != nil {
@@ -175,10 +156,10 @@ func (i *InitData) Init(parentCtx context.Context, invoker constants.Invoker) (r
// GetDbClient either creates a DB client using the configured connection string (if present) or creates a LocalDbClient
func GetDbClient(ctx context.Context, invoker constants.Invoker, onConnectionCallback db_client.DbConnectionCallback) (client db_common.Client, err error) {
if connectionString := viper.GetString(constants.ArgConnectionString); connectionString != "" {
statushooks.SetStatus(ctx, "Connecting to Remote Steampipe")
statushooks.SetStatus(ctx, "Connecting to remote Steampipe database")
client, err = db_client.NewDbClient(ctx, connectionString, onConnectionCallback)
} else {
statushooks.SetStatus(ctx, "Starting local Steampipe")
statushooks.SetStatus(ctx, "Starting local Steampipe database")
client, err = db_local.GetLocalClient(ctx, invoker, onConnectionCallback)
}
return client, err