Skip to content

Commit f44e205

Browse files
authored
check for empty client settings (#649)
* check for empty client settings * update the util.Await to run ActionWithErr so that we return errors and use ctx in the spinner closure * cleanup * propogate context * bump version
1 parent fa445e5 commit f44e205

File tree

5 files changed

+71
-52
lines changed

5 files changed

+71
-52
lines changed

cmd/lk/agent.go

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -704,8 +704,10 @@ func updateAgent(ctx context.Context, cmd *cli.Command) error {
704704
}
705705

706706
var resp *lkproto.UpdateAgentResponse
707-
util.Await("Updating agent ["+util.Accented(lkConfig.Agent.ID)+"]", func() {
708-
resp, err = agentsClient.UpdateAgent(ctx, req)
707+
err = util.Await("Updating agent ["+util.Accented(lkConfig.Agent.ID)+"]", ctx, func(ctx context.Context) error {
708+
var clientErr error
709+
resp, clientErr = agentsClient.UpdateAgent(ctx, req)
710+
return clientErr
709711
})
710712
if err != nil {
711713
if twerr, ok := err.(twirp.Error); ok {
@@ -732,11 +734,13 @@ func rollbackAgent(ctx context.Context, cmd *cli.Command) error {
732734
}
733735

734736
var resp *lkproto.RollbackAgentResponse
735-
util.Await("Rolling back agent ["+util.Accented(agentID)+"]", func() {
736-
resp, err = agentsClient.RollbackAgent(ctx, &lkproto.RollbackAgentRequest{
737+
err = util.Await("Rolling back agent ["+util.Accented(agentID)+"]", ctx, func(ctx context.Context) error {
738+
var clientErr error
739+
resp, clientErr = agentsClient.RollbackAgent(ctx, &lkproto.RollbackAgentRequest{
737740
AgentId: agentID,
738741
Version: cmd.String("version"),
739742
})
743+
return clientErr
740744
})
741745

742746
if err != nil {
@@ -790,25 +794,25 @@ func deleteAgent(ctx context.Context, cmd *cli.Command) error {
790794
}
791795

792796
var res *lkproto.DeleteAgentResponse
793-
var agentErr error
794-
if err := util.Await(
797+
err = util.Await(
795798
"Deleting agent ["+util.Accented(agentID)+"]",
796-
func() {
797-
res, agentErr = agentsClient.DeleteAgent(ctx, &lkproto.DeleteAgentRequest{
799+
ctx,
800+
func(ctx context.Context) error {
801+
var clientErr error
802+
res, clientErr = agentsClient.DeleteAgent(ctx, &lkproto.DeleteAgentRequest{
798803
AgentId: agentID,
799804
})
805+
return clientErr
800806
},
801-
); err != nil {
802-
return err
803-
}
807+
)
804808

805-
if agentErr != nil {
806-
if twerr, ok := agentErr.(twirp.Error); ok {
809+
if err != nil {
810+
if twerr, ok := err.(twirp.Error); ok {
807811
if twerr.Code() == twirp.PermissionDenied {
808812
return fmt.Errorf("agent hosting is disabled for this project -- join the beta program here [%s]", cloudAgentsBetaSignupURL)
809813
}
810814
}
811-
return agentErr
815+
return err
812816
}
813817

814818
if !res.Success {
@@ -1026,10 +1030,11 @@ func getAgentID(ctx context.Context, cmd *cli.Command, agentDir string, tomlFile
10261030

10271031
func selectAgent(ctx context.Context, _ *cli.Command, excludeEmptyVersion bool) (string, error) {
10281032
var agents *lkproto.ListAgentsResponse
1029-
var err error
10301033

1031-
util.Await("No agent ID provided, selecting from available agents...", func() {
1032-
agents, err = agentsClient.ListAgents(ctx, &lkproto.ListAgentsRequest{})
1034+
err := util.Await("No agent ID provided, selecting from available agents...", ctx, func(ctx context.Context) error {
1035+
var clientErr error
1036+
agents, clientErr = agentsClient.ListAgents(ctx, &lkproto.ListAgentsRequest{})
1037+
return clientErr
10331038
})
10341039
if err != nil {
10351040
if twerr, ok := err.(twirp.Error); ok {
@@ -1127,26 +1132,24 @@ func requireSecrets(_ context.Context, cmd *cli.Command, required, lazy bool) ([
11271132
return secretsSlice, nil
11281133
}
11291134

1130-
func requireDockerfile(_ context.Context, cmd *cli.Command, workingDir string, projectType agentfs.ProjectType, settingsMap map[string]string) error {
1135+
func requireDockerfile(ctx context.Context, cmd *cli.Command, workingDir string, projectType agentfs.ProjectType, settingsMap map[string]string) error {
11311136
dockerfileExists, err := agentfs.HasDockerfile(workingDir)
11321137
if err != nil {
11331138
return err
11341139
}
11351140

11361141
if !dockerfileExists {
11371142
if !cmd.Bool("silent") {
1138-
var innerErr error
1139-
if err := util.Await(
1143+
err := util.Await(
11401144
"Creating Dockerfile...",
1141-
func() {
1142-
innerErr = agentfs.CreateDockerfile(workingDir, projectType, settingsMap)
1145+
ctx,
1146+
func(ctx context.Context) error {
1147+
return agentfs.CreateDockerfile(workingDir, projectType, settingsMap)
11431148
},
1144-
); err != nil {
1149+
)
1150+
if err != nil {
11451151
return err
11461152
}
1147-
if innerErr != nil {
1148-
return innerErr
1149-
}
11501153
fmt.Println("Created [" + util.Accented("Dockerfile") + "]")
11511154
} else {
11521155
if err := agentfs.CreateDockerfile(workingDir, projectType, settingsMap); err != nil {
@@ -1169,8 +1172,10 @@ func getClientSettings(ctx context.Context, silent bool) (map[string]string, err
11691172
if !silent {
11701173
err = util.Await(
11711174
"Loading client settings...",
1172-
func() {
1175+
ctx,
1176+
func(ctx context.Context) error {
11731177
clientSettingsResponse, err = agentsClient.GetClientSettings(ctx, &lkproto.ClientSettingsRequest{})
1178+
return err
11741179
},
11751180
)
11761181
} else {
@@ -1186,6 +1191,10 @@ func getClientSettings(ctx context.Context, silent bool) (map[string]string, err
11861191
return nil, err
11871192
}
11881193

1194+
if clientSettingsResponse == nil {
1195+
return nil, fmt.Errorf("unable to contact server; please try again later")
1196+
}
1197+
11891198
settingsMap := make(map[string]string)
11901199
for _, setting := range clientSettingsResponse.Params {
11911200
settingsMap[setting.Name] = setting.Value

cmd/lk/app.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ import (
2424
"strings"
2525

2626
"github.com/charmbracelet/huh"
27+
"github.com/urfave/cli/v3"
28+
2729
"github.com/livekit/livekit-cli/v2/pkg/bootstrap"
2830
"github.com/livekit/livekit-cli/v2/pkg/config"
2931
"github.com/livekit/livekit-cli/v2/pkg/util"
30-
"github.com/urfave/cli/v3"
3132
)
3233

3334
var (
@@ -385,33 +386,35 @@ func setupTemplate(ctx context.Context, cmd *cli.Command) error {
385386
return cleanupTemplate(ctx, cmd, appName)
386387
}
387388

388-
func cloneTemplate(_ context.Context, cmd *cli.Command, url, appName string) error {
389+
func cloneTemplate(ctx context.Context, cmd *cli.Command, url, appName string) error {
389390
var stdout string
390391
var stderr string
391-
var cmdErr error
392392

393393
tempName, relocate, cleanup := util.UseTempPath(appName)
394394
defer cleanup()
395395

396-
if err := util.Await(
396+
err := util.Await(
397397
"Cloning template from "+url,
398-
func() {
398+
ctx,
399+
func(ctx context.Context) error {
400+
var cmdErr error
399401
stdout, stderr, cmdErr = bootstrap.CloneTemplate(url, tempName)
402+
return cmdErr
400403
},
401-
); err != nil {
402-
return err
403-
}
404+
)
404405

406+
// err is handled after checking stdout and stderr
405407
if len(stdout) > 0 && cmd.Bool("verbose") {
406408
fmt.Println(string(stdout))
407409
}
408410
if len(stderr) > 0 && cmd.Bool("verbose") {
409411
fmt.Fprintln(os.Stderr, string(stderr))
410412
}
411413

412-
if cmdErr != nil {
413-
return cmdErr
414+
if err != nil {
415+
return err
414416
}
417+
415418
return relocate()
416419
}
417420

@@ -512,14 +515,17 @@ func doInstall(ctx context.Context, task bootstrap.KnownTask, rootPath string, v
512515
return err
513516
}
514517

515-
var cmdErr error
516-
if err := util.Await(
518+
err = util.Await(
517519
"Installing...",
518-
func() { cmdErr = install() },
519-
); err != nil {
520+
ctx,
521+
func(ctx context.Context) error {
522+
return install()
523+
},
524+
)
525+
if err != nil {
520526
return err
521527
}
522-
return cmdErr
528+
return nil
523529
}
524530

525531
func runTask(ctx context.Context, cmd *cli.Command) error {

cmd/lk/cloud.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -300,18 +300,19 @@ func tryAuthIfNeeded(ctx context.Context, cmd *cli.Command) error {
300300
_ = browser.OpenURL(authURL.String()) // discard result; this will fail in headless environments
301301

302302
var ak *ClaimAccessKeyResponse
303-
var pollErr error
304-
if err := util.Await(
303+
err = util.Await(
305304
"Awaiting confirmation...",
306-
func() {
305+
ctx,
306+
func(ctx context.Context) error {
307+
var pollErr error
307308
ak, pollErr = pollClaim(ctx, cmd)
309+
return pollErr
308310
},
309-
); err != nil {
311+
)
312+
if err != nil {
310313
return err
311314
}
312-
if pollErr != nil {
313-
return pollErr
314-
}
315+
315316
if ak == nil {
316317
return errors.New("operation cancelled")
317318
}

pkg/util/action.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,18 @@
1515
package util
1616

1717
import (
18+
"context"
19+
1820
"github.com/charmbracelet/huh/spinner"
1921
)
2022

2123
// Call an action and show a spinner while waiting for it to finish.
22-
func Await(title string, action func()) error {
24+
func Await(title string, ctx context.Context, action func(ctx context.Context) error) error {
2325
return spinner.New().
2426
Title(" " + title).
25-
Action(action).
27+
ActionWithErr(action).
2628
Type(spinner.Pulse).
2729
Style(Theme.Focused.Title).
30+
Context(ctx).
2831
Run()
2932
}

version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@
1515
package livekitcli
1616

1717
const (
18-
Version = "2.5.0"
18+
Version = "2.5.1"
1919
)

0 commit comments

Comments
 (0)