Skip to content

Commit 32b6042

Browse files
[CAP-9160] skip auth and workspace prompts for --local commands (#321)
Skip the interactive login and workspace-selection prompts when `--local` is passed to workflow commands. GitOrigin-RevId: bd51c011a345af5c8cb5301fa563323f2b6e2c49
1 parent 639c35e commit 32b6042

4 files changed

Lines changed: 82 additions & 6 deletions

File tree

cmd/root.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,15 @@ var rootCmd = &cobra.Command{
5959

6060
var m tea.Model = stack
6161

62-
if cmd.Name() != deps.Commands.WorkspaceSetCmd().Name() {
62+
local := isLocalCommand(cmd)
63+
64+
if !local && cmd.Name() != deps.Commands.WorkspaceSetCmd().Name() {
6365
if !config.IsWorkspaceSet() {
6466
m = tui.NewConfigWrapper(m, "Set Workspace", views.NewWorkspaceView(ctx, views.ListWorkspaceInput{}))
6567
}
6668
}
6769

68-
if cmd.Name() != loginCmd.Name() {
70+
if !local && cmd.Name() != loginCmd.Name() {
6971
m = tui.NewConfigWrapper(m, "Login", views.NewLoginView(ctx))
7072
}
7173

@@ -81,6 +83,15 @@ var rootCmd = &cobra.Command{
8183
},
8284
}
8385

86+
func isLocalCommand(cmd *cobra.Command) bool {
87+
v, err := cmd.Flags().GetBool("local")
88+
if err != nil {
89+
// Flag doesn't exist or isn't a bool
90+
return false
91+
}
92+
return v
93+
}
94+
8495
func setupWorkflowCommands(deps *dependencies.Dependencies) {
8596
deps.Commands.Workflow.TaskListCmd = NewTaskListCmd(deps)
8697
deps.Commands.Workflow.TaskRunCmd = NewTaskRunStartCmd(deps)

cmd/task.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func (d *localDeps) WorkflowLoader() *workflowviews.WorkflowLoader {
134134
}
135135

136136
func (d *localDeps) LogLoader() *views.LogLoader {
137-
return views.NewLogLoader(d.LogRepo(), nil, nil, nil, nil)
137+
return views.NewLocalLogLoader(d.LogRepo())
138138
}
139139

140140
func getLocalDeps(cmd *cobra.Command, deps flows.WorkflowDeps) (flows.WorkflowDeps, bool, error) {

pkg/tui/views/logloader.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,17 @@ type LogLoader struct {
2222
kvRepo *keyvalue.Repo
2323
postgresRepo *postgres.Repo
2424
workflowRepo *workflow.Repo
25+
local bool
2526
}
2627

2728
func NewLogLoader(logRepo *logs.LogRepo, serviceRepo *service.Repo, kvRepo *keyvalue.Repo, postgresRepo *postgres.Repo, workflowRepo *workflow.Repo) *LogLoader {
2829
return &LogLoader{logRepo: logRepo, serviceRepo: serviceRepo, kvRepo: kvRepo, postgresRepo: postgresRepo, workflowRepo: workflowRepo}
2930
}
3031

32+
func NewLocalLogLoader(logRepo *logs.LogRepo) *LogLoader {
33+
return &LogLoader{logRepo: logRepo, local: true}
34+
}
35+
3136
func (l *LogLoader) LoadLogData(ctx context.Context, in LogInput) (*tui.LogResult, error) {
3237
params, err := l.ToParam(ctx, in)
3338
if err != nil {
@@ -119,9 +124,13 @@ func (l *LogLoader) getResourceIDsFromIDOrNames(ctx context.Context, idOrNames [
119124
}
120125

121126
func (l *LogLoader) ToParam(ctx context.Context, in LogInput) (*client.ListLogsParams, error) {
122-
ownerID, err := config.WorkspaceID()
123-
if err != nil {
124-
return nil, fmt.Errorf("error getting workspace ID: %v", err)
127+
var ownerID string
128+
if !l.local {
129+
var err error
130+
ownerID, err = config.WorkspaceID()
131+
if err != nil {
132+
return nil, fmt.Errorf("error getting workspace ID: %v", err)
133+
}
125134
}
126135

127136
if in.Limit == 0 {

pkg/tui/views/logloader_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package views_test
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/render-oss/cli/pkg/config"
8+
"github.com/render-oss/cli/pkg/tui/views"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestLogLoaderToParam(t *testing.T) {
13+
clearAuthEnv := func(t *testing.T) {
14+
t.Helper()
15+
t.Setenv("RENDER_WORKSPACE", "")
16+
t.Setenv("RENDER_API_KEY", "")
17+
t.Setenv("RENDER_CLI_CONFIG_PATH", t.TempDir()+"/nonexistent.yaml")
18+
}
19+
20+
resourceID := "srv-abcdef1234567890abcd"
21+
22+
t.Run("local does not require workspace", func(t *testing.T) {
23+
clearAuthEnv(t)
24+
25+
loader := views.NewLocalLogLoader(nil)
26+
params, err := loader.ToParam(context.Background(), views.LogInput{
27+
ResourceIDs: []string{"wfl-local"},
28+
})
29+
require.NoError(t, err)
30+
require.Equal(t, "", params.OwnerId)
31+
require.Equal(t, []string{"wfl-local"}, params.Resource)
32+
})
33+
34+
t.Run("production requires workspace", func(t *testing.T) {
35+
clearAuthEnv(t)
36+
37+
loader := views.NewLogLoader(nil, nil, nil, nil, nil)
38+
_, err := loader.ToParam(context.Background(), views.LogInput{
39+
ResourceIDs: []string{resourceID},
40+
})
41+
require.ErrorContains(t, err, config.ErrNoWorkspace.Error())
42+
})
43+
44+
t.Run("production includes workspace when set", func(t *testing.T) {
45+
clearAuthEnv(t)
46+
t.Setenv("RENDER_WORKSPACE", "wrk-test123")
47+
48+
loader := views.NewLogLoader(nil, nil, nil, nil, nil)
49+
params, err := loader.ToParam(context.Background(), views.LogInput{
50+
ResourceIDs: []string{resourceID},
51+
})
52+
require.NoError(t, err)
53+
require.Equal(t, "wrk-test123", params.OwnerId)
54+
require.Equal(t, []string{resourceID}, params.Resource)
55+
})
56+
}

0 commit comments

Comments
 (0)