Skip to content

Commit 3adf5ea

Browse files
committed
more explicit path'ing and workdir for agent commands, add the subdomain project lookup to support agent hosting toml
1 parent cbff42f commit 3adf5ea

File tree

3 files changed

+114
-13
lines changed

3 files changed

+114
-13
lines changed

cmd/lk/agent.go

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
)
2525

2626
type AgentTOML struct {
27-
LocalProjectName string `toml:"local_project_name"`
2827
ProjectSubdomain string `toml:"project_subdomain"`
2928
Name string `toml:"name"`
3029
CPU string `toml:"cpu"`
@@ -104,13 +103,14 @@ var (
104103
},
105104
{
106105
Name: "config",
107-
Usage: fmt.Sprintf("Creates a %s in the current directory for an existing agent.", AgentTOMLFile),
106+
Usage: fmt.Sprintf("Creates a %s in the working directory for an existing agent.", AgentTOMLFile),
108107
Before: createAgentClient,
109108
Action: createAgentConfig,
110109
Flags: []cli.Flag{
111110
nameFlag(true),
112111
tomlFlag,
113112
},
113+
ArgsUsage: "[working-dir]",
114114
},
115115
{
116116
Name: "deploy",
@@ -131,6 +131,7 @@ var (
131131
nameFlag(false),
132132
tomlFlag,
133133
},
134+
ArgsUsage: "[working-dir]",
134135
},
135136
{
136137
Name: "update",
@@ -159,6 +160,7 @@ var (
159160
nameFlag(false),
160161
tomlFlag,
161162
},
163+
ArgsUsage: "[working-dir]",
162164
},
163165
{
164166
Name: "logs",
@@ -170,6 +172,7 @@ var (
170172
nameFlag(false),
171173
tomlFlag,
172174
},
175+
ArgsUsage: "[working-dir]",
173176
},
174177
{
175178
Name: "delete",
@@ -181,6 +184,7 @@ var (
181184
nameFlag(false),
182185
tomlFlag,
183186
},
187+
ArgsUsage: "[working-dir]",
184188
},
185189
{
186190
Name: "versions",
@@ -191,6 +195,7 @@ var (
191195
nameFlag(false),
192196
tomlFlag,
193197
},
198+
ArgsUsage: "[working-dir]",
194199
},
195200
{
196201
Name: "list",
@@ -199,6 +204,11 @@ var (
199204
Before: createAgentClient,
200205
Flags: []cli.Flag{
201206
nameSliceFlag,
207+
&cli.StringFlag{
208+
Name: "project",
209+
Usage: "Project to list agents for",
210+
Required: false,
211+
},
202212
},
203213
},
204214
{
@@ -210,6 +220,7 @@ var (
210220
nameFlag(false),
211221
tomlFlag,
212222
},
223+
ArgsUsage: "[working-dir]",
213224
},
214225
{
215226
Name: "update-secrets",
@@ -228,6 +239,7 @@ var (
228239
Value: false,
229240
},
230241
},
242+
ArgsUsage: "[working-dir]",
231243
},
232244
},
233245
},
@@ -239,13 +251,29 @@ var (
239251

240252
func createAgentClient(ctx context.Context, cmd *cli.Command) (context.Context, error) {
241253
var err error
254+
var agentConfig *AgentTOML
255+
if cmd.String("toml") != "" {
256+
workingDir := "."
257+
if cmd.NArg() > 0 {
258+
workingDir = cmd.Args().First()
259+
}
260+
agentConfig, err = loadTomlFile(workingDir, cmd.String("toml"))
261+
if err != nil {
262+
return nil, err
263+
}
264+
265+
cmd.Set("subdomain", agentConfig.ProjectSubdomain)
266+
} else if cmd.String("project") != "" {
267+
cmd.Set("project", cmd.String("project"))
268+
}
269+
242270
globalProjectConfig, err = loadProjectDetails(cmd)
243271
if err != nil {
244272
return nil, err
245273
}
246274

247275
agentsClient, err = lksdk.NewAgentClient(globalProjectConfig.URL, globalProjectConfig.APIKey, globalProjectConfig.APISecret)
248-
return ctx, err
276+
return nil, err
249277
}
250278

251279
func loadTomlFile(dir string, tomlFileName string) (*AgentTOML, error) {
@@ -362,7 +390,6 @@ func createAgent(ctx context.Context, cmd *cli.Command) error {
362390
defer f.Close()
363391

364392
agentConfig = &AgentTOML{
365-
LocalProjectName: globalProjectConfig.Name,
366393
ProjectSubdomain: subdomainMatches[1],
367394
Name: cmd.String("name"),
368395
CPU: clientDefaults_CPU,
@@ -565,7 +592,6 @@ func createAgentConfig(ctx context.Context, cmd *cli.Command) error {
565592
agent := response.Agents[0]
566593
regionAgent := agent.AgentDeployments[0]
567594
agentConfig := &AgentTOML{
568-
LocalProjectName: globalProjectConfig.Name,
569595
ProjectSubdomain: matches[1],
570596
Name: agent.AgentName,
571597
CPU: regionAgent.CpuReq,
@@ -672,7 +698,11 @@ func deployAgent(ctx context.Context, cmd *cli.Command) error {
672698
}
673699

674700
func getAgentStatus(ctx context.Context, cmd *cli.Command) error {
675-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
701+
workingDir := "."
702+
if cmd.NArg() > 0 {
703+
workingDir = cmd.Args().First()
704+
}
705+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
676706
if err != nil {
677707
return err
678708
}
@@ -766,7 +796,12 @@ func updateAgent(ctx context.Context, cmd *cli.Command) error {
766796
}
767797

768798
func rollbackAgent(ctx context.Context, cmd *cli.Command) error {
769-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
799+
workingDir := "."
800+
if cmd.NArg() > 0 {
801+
workingDir = cmd.Args().First()
802+
}
803+
804+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
770805
if err != nil {
771806
return err
772807
}
@@ -790,7 +825,11 @@ func rollbackAgent(ctx context.Context, cmd *cli.Command) error {
790825
}
791826

792827
func getLogs(ctx context.Context, cmd *cli.Command) error {
793-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
828+
workingDir := "."
829+
if cmd.NArg() > 0 {
830+
workingDir = cmd.Args().First()
831+
}
832+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
794833
if err != nil {
795834
return err
796835
}
@@ -799,7 +838,11 @@ func getLogs(ctx context.Context, cmd *cli.Command) error {
799838
}
800839

801840
func deleteAgent(ctx context.Context, cmd *cli.Command) error {
802-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
841+
workingDir := "."
842+
if cmd.NArg() > 0 {
843+
workingDir = cmd.Args().First()
844+
}
845+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
803846
if err != nil {
804847
return err
805848
}
@@ -840,7 +883,11 @@ func deleteAgent(ctx context.Context, cmd *cli.Command) error {
840883
}
841884

842885
func listAgentVersions(ctx context.Context, cmd *cli.Command) error {
843-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
886+
workingDir := "."
887+
if cmd.NArg() > 0 {
888+
workingDir = cmd.Args().First()
889+
}
890+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
844891
if err != nil {
845892
return err
846893
}
@@ -912,7 +959,11 @@ func listAgents(ctx context.Context, cmd *cli.Command) error {
912959
}
913960

914961
func listAgentSecrets(ctx context.Context, cmd *cli.Command) error {
915-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
962+
workingDir := "."
963+
if cmd.NArg() > 0 {
964+
workingDir = cmd.Args().First()
965+
}
966+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
916967
if err != nil {
917968
return err
918969
}
@@ -938,7 +989,11 @@ func listAgentSecrets(ctx context.Context, cmd *cli.Command) error {
938989
}
939990

940991
func updateAgentSecrets(ctx context.Context, cmd *cli.Command) error {
941-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
992+
workingDir := "."
993+
if cmd.NArg() > 0 {
994+
workingDir = cmd.Args().First()
995+
}
996+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
942997
if err != nil {
943998
return err
944999
}

cmd/lk/utils.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ var (
5050
Name: "url",
5151
Usage: "`URL` to LiveKit instance",
5252
Sources: cli.EnvVars("LIVEKIT_URL"),
53-
Value: "http://localhost:7880",
5453
},
5554
&cli.StringFlag{
5655
Name: "api-key",
@@ -66,6 +65,10 @@ var (
6665
Name: "project",
6766
Usage: "`NAME` of a configured project",
6867
},
68+
&cli.StringFlag{
69+
Name: "subdomain",
70+
Usage: "`SUBDOMAIN` of a configured project",
71+
},
6972
&cli.BoolFlag{
7073
Name: "curl",
7174
Usage: "Print curl commands for API actions",
@@ -171,6 +174,17 @@ func loadProjectDetails(c *cli.Command, opts ...loadOption) (*config.ProjectConf
171174
return pc, nil
172175
}
173176

177+
// if explicit subdomain is provided, use it
178+
if c.String("subdomain") != "" {
179+
pc, err := config.LoadProjectBySubdomain(c.String("subdomain"))
180+
if err != nil {
181+
return nil, err
182+
}
183+
fmt.Println("Using project [" + util.Theme.Focused.Title.Render(pc.Name) + "]")
184+
logDetails(c, pc)
185+
return pc, nil
186+
}
187+
174188
pc := &config.ProjectConfig{}
175189
if val := c.String("url"); val != "" {
176190
pc.URL = val

pkg/config/config.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"fmt"
2020
"os"
2121
"path"
22+
"regexp"
2223
"strings"
2324

2425
"gopkg.in/yaml.v3"
@@ -57,6 +58,37 @@ func LoadDefaultProject() (*ProjectConfig, error) {
5758
return nil, errors.New("no default project set")
5859
}
5960

61+
func LoadProjectBySubdomain(subdomain string) (*ProjectConfig, error) {
62+
conf, err := LoadOrCreate()
63+
if err != nil {
64+
return nil, err
65+
}
66+
67+
if subdomain == "" {
68+
return nil, errors.New("invalid URL")
69+
}
70+
71+
fmt.Println("Loading project by subdomain", subdomain)
72+
73+
extractSubdomain := func(url string) string {
74+
subdomainPattern := regexp.MustCompile(`^(?:https?|wss?)://([^.]+)\.`)
75+
matches := subdomainPattern.FindStringSubmatch(url)
76+
if len(matches) > 1 {
77+
return matches[1]
78+
}
79+
return ""
80+
}
81+
82+
for _, p := range conf.Projects {
83+
projectSubdomain := extractSubdomain(p.URL)
84+
if projectSubdomain == subdomain {
85+
return &p, nil
86+
}
87+
}
88+
89+
return nil, errors.New("project not found")
90+
}
91+
6092
func LoadProject(name string) (*ProjectConfig, error) {
6193
conf, err := LoadOrCreate()
6294
if err != nil {

0 commit comments

Comments
 (0)