Skip to content

Commit 83a20ff

Browse files
Matovidloclaude
andcommitted
fix: extract ListAllWorkspaces helper and fix sandbox package comment
- Add sandbox.ListAllWorkspaces to eliminate duplicated parallel-fetch + combined-list-building logic that was repeated verbatim in dbt/generate/env/cmd.go, remote/workspace/delete/cmd.go, and workspace/list/operation.go - Fix package comment in sandbox.go to reference the tagged release v2.18.0 instead of the pseudo-version commit hash Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent bc5cd01 commit 83a20ff

4 files changed

Lines changed: 63 additions & 142 deletions

File tree

internal/pkg/keboola/sandbox/sandbox.go

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Package sandbox provides Python/R workspace types and operations that were removed
2-
// from keboola-sdk-go v2.17.1-0.20260326112115-8a6ce0872c8a. The SDK now exposes
3-
// DataScienceApp for listing/fetching workspaces; this package bridges the gap for
4-
// existing callers without requiring a full migration.
2+
// from keboola-sdk-go v2.18.0. The SDK now exposes DataScienceApp for listing/fetching
3+
// workspaces; this package bridges the gap for existing callers without requiring a
4+
// full migration.
55
package sandbox
66

77
import (
@@ -12,6 +12,7 @@ import (
1212
"github.com/hashicorp/go-multierror"
1313
"github.com/keboola/keboola-sdk-go/v2/pkg/keboola"
1414
"github.com/keboola/keboola-sdk-go/v2/pkg/request"
15+
"golang.org/x/sync/errgroup"
1516

1617
"github.com/keboola/keboola-as-code/internal/pkg/utils/errors"
1718
)
@@ -286,6 +287,59 @@ func ListSandboxWorkspaces(
286287
return out, configs, nil
287288
}
288289

290+
// ListAllWorkspaces fetches Python/R workspaces and SQL editor sessions in parallel,
291+
// returning a combined list and the raw sessions (needed by callers that look up credentials).
292+
func ListAllWorkspaces(
293+
ctx context.Context,
294+
api *keboola.AuthorizedAPI,
295+
branchID keboola.BranchID,
296+
) ([]*SandboxWorkspaceWithConfig, []*keboola.EditorSession, error) {
297+
var pyRWorkspaces []*SandboxWorkspaceWithConfig
298+
var allConfigs []*keboola.Config
299+
var sessions []*keboola.EditorSession
300+
301+
grp, grpCtx := errgroup.WithContext(ctx)
302+
grp.Go(func() error {
303+
var e error
304+
pyRWorkspaces, allConfigs, e = ListSandboxWorkspaces(grpCtx, api, branchID)
305+
return e
306+
})
307+
grp.Go(func() error {
308+
result, e := api.ListEditorSessionsRequest().Send(grpCtx)
309+
if e != nil {
310+
return e
311+
}
312+
sessions = *result
313+
return nil
314+
})
315+
if err := grp.Wait(); err != nil {
316+
return nil, nil, err
317+
}
318+
319+
configNameMap := make(map[string]string)
320+
for _, c := range allConfigs {
321+
configNameMap[c.ID.String()] = c.Name
322+
}
323+
324+
all := make([]*SandboxWorkspaceWithConfig, 0, len(pyRWorkspaces)+len(sessions))
325+
all = append(all, pyRWorkspaces...)
326+
for _, s := range sessions {
327+
name := configNameMap[s.ConfigurationID]
328+
all = append(all, &SandboxWorkspaceWithConfig{
329+
Config: &keboola.Config{
330+
ConfigKey: keboola.ConfigKey{ID: keboola.ConfigID(s.ConfigurationID)},
331+
Name: name,
332+
},
333+
SandboxWorkspace: &SandboxWorkspace{
334+
ID: keboola.SandboxWorkspaceID(s.ID),
335+
Type: keboola.SandboxWorkspaceType(s.BackendType),
336+
},
337+
})
338+
}
339+
340+
return all, sessions, nil
341+
}
342+
289343
// WorkspaceFromStorage constructs a SandboxWorkspace from StorageWorkspace credentials,
290344
// used when credentials come from an editor session (SQL workspaces).
291345
func WorkspaceFromStorage(sw *keboola.StorageWorkspace, wsType keboola.SandboxWorkspaceType) *SandboxWorkspace {

internal/pkg/service/cli/cmd/dbt/generate/env/cmd.go

Lines changed: 2 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package env
22

33
import (
4-
"github.com/keboola/keboola-sdk-go/v2/pkg/keboola"
54
"github.com/spf13/cobra"
6-
"golang.org/x/sync/errgroup"
75

86
"github.com/keboola/keboola-as-code/internal/pkg/keboola/sandbox"
97
"github.com/keboola/keboola-as-code/internal/pkg/service/cli/dependencies"
@@ -53,55 +51,11 @@ func Command(p dependencies.Provider) *cobra.Command {
5351
return errors.Errorf("cannot get default branch: %w", err)
5452
}
5553

56-
// Fetch Python/R sandbox workspaces, SQL editor sessions, and sandbox configs in parallel.
57-
// Fetch Python/R workspaces and editor sessions in parallel.
58-
// ListSandboxWorkspaces also returns all sandbox configs, so no separate fetch is needed.
59-
var pyRWorkspaces []*sandbox.SandboxWorkspaceWithConfig
60-
var allConfigs []*keboola.Config
61-
var sessions []*keboola.EditorSession
62-
63-
grp, grpCtx := errgroup.WithContext(cmd.Context())
64-
grp.Go(func() error {
65-
var e error
66-
pyRWorkspaces, allConfigs, e = sandbox.ListSandboxWorkspaces(grpCtx, d.KeboolaProjectAPI(), branch.ID)
67-
return e
68-
})
69-
grp.Go(func() error {
70-
result, e := d.KeboolaProjectAPI().ListEditorSessionsRequest().Send(grpCtx)
71-
if e != nil {
72-
return e
73-
}
74-
sessions = *result
75-
return nil
76-
})
77-
if err := grp.Wait(); err != nil {
54+
allWorkspaces, sessions, err := sandbox.ListAllWorkspaces(cmd.Context(), d.KeboolaProjectAPI(), branch.ID)
55+
if err != nil {
7856
return err
7957
}
8058

81-
// Build config name map for editor session name lookup.
82-
configNameMap := make(map[string]string)
83-
for _, c := range allConfigs {
84-
configNameMap[c.ID.String()] = c.Name
85-
}
86-
87-
// Build combined workspace list: Python/R + SQL editor sessions.
88-
// For SQL sessions, SandboxWorkspace.ID stores the EditorSessionID for credential lookup.
89-
allWorkspaces := make([]*sandbox.SandboxWorkspaceWithConfig, 0, len(pyRWorkspaces)+len(sessions))
90-
allWorkspaces = append(allWorkspaces, pyRWorkspaces...)
91-
for _, s := range sessions {
92-
name := configNameMap[s.ConfigurationID]
93-
allWorkspaces = append(allWorkspaces, &sandbox.SandboxWorkspaceWithConfig{
94-
Config: &keboola.Config{
95-
ConfigKey: keboola.ConfigKey{ID: keboola.ConfigID(s.ConfigurationID)},
96-
Name: name,
97-
},
98-
SandboxWorkspace: &sandbox.SandboxWorkspace{
99-
ID: keboola.SandboxWorkspaceID(s.ID),
100-
Type: keboola.SandboxWorkspaceType(s.BackendType),
101-
},
102-
})
103-
}
104-
10559
opts, err := AskGenerateEnv(cmd.Context(), branch.BranchKey, branch.ID, d.Dialogs(), allWorkspaces, sessions, f, p.BaseScope().Environment(), d.KeboolaProjectAPI())
10660
if err != nil {
10761
return err

internal/pkg/service/cli/cmd/remote/workspace/delete/cmd.go

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package deleteworkspace
22

33
import (
4-
"github.com/keboola/keboola-sdk-go/v2/pkg/keboola"
54
"github.com/spf13/cobra"
6-
"golang.org/x/sync/errgroup"
75

86
"github.com/keboola/keboola-as-code/internal/pkg/keboola/sandbox"
97
"github.com/keboola/keboola-as-code/internal/pkg/service/cli/dependencies"
@@ -47,54 +45,11 @@ func Command(p dependencies.Provider) *cobra.Command {
4745
return errors.Errorf("cannot get default branch: %w", err)
4846
}
4947

50-
// Fetch Python/R workspaces and editor sessions in parallel.
51-
// ListSandboxWorkspaces also returns all sandbox configs, so no separate fetch is needed.
52-
var pyRWorkspaces []*sandbox.SandboxWorkspaceWithConfig
53-
var allConfigs []*keboola.Config
54-
var sessions []*keboola.EditorSession
55-
56-
grp, grpCtx := errgroup.WithContext(cmd.Context())
57-
grp.Go(func() error {
58-
var e error
59-
pyRWorkspaces, allConfigs, e = sandbox.ListSandboxWorkspaces(grpCtx, d.KeboolaProjectAPI(), branch.ID)
60-
return e
61-
})
62-
grp.Go(func() error {
63-
result, e := d.KeboolaProjectAPI().ListEditorSessionsRequest().Send(grpCtx)
64-
if e != nil {
65-
return e
66-
}
67-
sessions = *result
68-
return nil
69-
})
70-
if err := grp.Wait(); err != nil {
48+
allWorkspaces, _, err := sandbox.ListAllWorkspaces(cmd.Context(), d.KeboolaProjectAPI(), branch.ID)
49+
if err != nil {
7150
return err
7251
}
7352

74-
// Build config name map for editor session name lookup.
75-
configNameMap := make(map[string]string)
76-
for _, c := range allConfigs {
77-
configNameMap[c.ID.String()] = c.Name
78-
}
79-
80-
// Build combined list: Python/R workspaces + SQL editor sessions.
81-
// For editor sessions, SandboxWorkspace.ID stores the EditorSessionID for later deletion.
82-
allWorkspaces := make([]*sandbox.SandboxWorkspaceWithConfig, 0, len(pyRWorkspaces)+len(sessions))
83-
allWorkspaces = append(allWorkspaces, pyRWorkspaces...)
84-
for _, s := range sessions {
85-
name := configNameMap[s.ConfigurationID]
86-
allWorkspaces = append(allWorkspaces, &sandbox.SandboxWorkspaceWithConfig{
87-
Config: &keboola.Config{
88-
ConfigKey: keboola.ConfigKey{ID: keboola.ConfigID(s.ConfigurationID)},
89-
Name: name,
90-
},
91-
SandboxWorkspace: &sandbox.SandboxWorkspace{
92-
ID: keboola.SandboxWorkspaceID(s.ID),
93-
Type: keboola.SandboxWorkspaceType(s.BackendType),
94-
},
95-
})
96-
}
97-
9853
ws, err := d.Dialogs().AskWorkspace(allWorkspaces, f.WorkspaceID)
9954
if err != nil {
10055
return err

pkg/lib/operation/project/remote/workspace/list/operation.go

Lines changed: 2 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"sort"
66

77
"github.com/keboola/keboola-sdk-go/v2/pkg/keboola"
8-
"golang.org/x/sync/errgroup"
98

109
"github.com/keboola/keboola-as-code/internal/pkg/keboola/sandbox"
1110
"github.com/keboola/keboola-as-code/internal/pkg/log"
@@ -32,52 +31,11 @@ func Run(ctx context.Context, d dependencies) (err error) {
3231

3332
logger.Info(ctx, "Loading workspaces, please wait.")
3433

35-
// Fetch Python/R workspaces and editor sessions in parallel.
36-
// ListSandboxWorkspaces also returns all sandbox configs, so no separate fetch is needed.
37-
var pyRWorkspaces []*sandbox.SandboxWorkspaceWithConfig
38-
var allConfigs []*keboola.Config
39-
var sessions []*keboola.EditorSession
40-
41-
grp, grpCtx := errgroup.WithContext(ctx)
42-
grp.Go(func() error {
43-
var e error
44-
pyRWorkspaces, allConfigs, e = sandbox.ListSandboxWorkspaces(grpCtx, d.KeboolaProjectAPI(), branch.ID)
45-
return e
46-
})
47-
grp.Go(func() error {
48-
result, e := d.KeboolaProjectAPI().ListEditorSessionsRequest().Send(grpCtx)
49-
if e != nil {
50-
return e
51-
}
52-
sessions = *result
53-
return nil
54-
})
55-
if err := grp.Wait(); err != nil {
34+
all, _, err := sandbox.ListAllWorkspaces(ctx, d.KeboolaProjectAPI(), branch.ID)
35+
if err != nil {
5636
return err
5737
}
5838

59-
// Build config name map for editor session name lookup.
60-
configNameMap := make(map[string]string)
61-
for _, c := range allConfigs {
62-
configNameMap[c.ID.String()] = c.Name
63-
}
64-
65-
// Build combined list: Python/R workspaces + SQL editor sessions.
66-
all := make([]*sandbox.SandboxWorkspaceWithConfig, 0, len(pyRWorkspaces)+len(sessions))
67-
all = append(all, pyRWorkspaces...)
68-
for _, s := range sessions {
69-
name := configNameMap[s.ConfigurationID]
70-
all = append(all, &sandbox.SandboxWorkspaceWithConfig{
71-
Config: &keboola.Config{
72-
ConfigKey: keboola.ConfigKey{ID: keboola.ConfigID(s.ConfigurationID)},
73-
Name: name,
74-
},
75-
SandboxWorkspace: &sandbox.SandboxWorkspace{
76-
Type: keboola.SandboxWorkspaceType(s.BackendType),
77-
},
78-
})
79-
}
80-
8139
sort.Slice(all, func(i, j int) bool { return all[i].Config.Name < all[j].Config.Name })
8240

8341
logger.Info(ctx, "Found workspaces:")

0 commit comments

Comments
 (0)