Skip to content

Commit ad4c964

Browse files
authored
add support for project lookup via subdomain (#537)
* more explicit path'ing and workdir for agent commands, add the subdomain project lookup to support agent hosting toml * add back an old default * add nanpa file * remove extraneous project flag
1 parent cbff42f commit ad4c964

File tree

4 files changed

+110
-12
lines changed

4 files changed

+110
-12
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
minor type="changed" "updated project config loading to support subdomain"

cmd/lk/agent.go

Lines changed: 62 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",
@@ -210,6 +215,7 @@ var (
210215
nameFlag(false),
211216
tomlFlag,
212217
},
218+
ArgsUsage: "[working-dir]",
213219
},
214220
{
215221
Name: "update-secrets",
@@ -228,6 +234,7 @@ var (
228234
Value: false,
229235
},
230236
},
237+
ArgsUsage: "[working-dir]",
231238
},
232239
},
233240
},
@@ -239,13 +246,29 @@ var (
239246

240247
func createAgentClient(ctx context.Context, cmd *cli.Command) (context.Context, error) {
241248
var err error
249+
var agentConfig *AgentTOML
250+
if cmd.String("toml") != "" {
251+
workingDir := "."
252+
if cmd.NArg() > 0 {
253+
workingDir = cmd.Args().First()
254+
}
255+
agentConfig, err = loadTomlFile(workingDir, cmd.String("toml"))
256+
if err != nil {
257+
return nil, err
258+
}
259+
260+
cmd.Set("subdomain", agentConfig.ProjectSubdomain)
261+
} else if cmd.String("project") != "" {
262+
cmd.Set("project", cmd.String("project"))
263+
}
264+
242265
globalProjectConfig, err = loadProjectDetails(cmd)
243266
if err != nil {
244267
return nil, err
245268
}
246269

247270
agentsClient, err = lksdk.NewAgentClient(globalProjectConfig.URL, globalProjectConfig.APIKey, globalProjectConfig.APISecret)
248-
return ctx, err
271+
return nil, err
249272
}
250273

251274
func loadTomlFile(dir string, tomlFileName string) (*AgentTOML, error) {
@@ -362,7 +385,6 @@ func createAgent(ctx context.Context, cmd *cli.Command) error {
362385
defer f.Close()
363386

364387
agentConfig = &AgentTOML{
365-
LocalProjectName: globalProjectConfig.Name,
366388
ProjectSubdomain: subdomainMatches[1],
367389
Name: cmd.String("name"),
368390
CPU: clientDefaults_CPU,
@@ -565,7 +587,6 @@ func createAgentConfig(ctx context.Context, cmd *cli.Command) error {
565587
agent := response.Agents[0]
566588
regionAgent := agent.AgentDeployments[0]
567589
agentConfig := &AgentTOML{
568-
LocalProjectName: globalProjectConfig.Name,
569590
ProjectSubdomain: matches[1],
570591
Name: agent.AgentName,
571592
CPU: regionAgent.CpuReq,
@@ -672,7 +693,11 @@ func deployAgent(ctx context.Context, cmd *cli.Command) error {
672693
}
673694

674695
func getAgentStatus(ctx context.Context, cmd *cli.Command) error {
675-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
696+
workingDir := "."
697+
if cmd.NArg() > 0 {
698+
workingDir = cmd.Args().First()
699+
}
700+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
676701
if err != nil {
677702
return err
678703
}
@@ -766,7 +791,12 @@ func updateAgent(ctx context.Context, cmd *cli.Command) error {
766791
}
767792

768793
func rollbackAgent(ctx context.Context, cmd *cli.Command) error {
769-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
794+
workingDir := "."
795+
if cmd.NArg() > 0 {
796+
workingDir = cmd.Args().First()
797+
}
798+
799+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
770800
if err != nil {
771801
return err
772802
}
@@ -790,7 +820,11 @@ func rollbackAgent(ctx context.Context, cmd *cli.Command) error {
790820
}
791821

792822
func getLogs(ctx context.Context, cmd *cli.Command) error {
793-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
823+
workingDir := "."
824+
if cmd.NArg() > 0 {
825+
workingDir = cmd.Args().First()
826+
}
827+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
794828
if err != nil {
795829
return err
796830
}
@@ -799,7 +833,11 @@ func getLogs(ctx context.Context, cmd *cli.Command) error {
799833
}
800834

801835
func deleteAgent(ctx context.Context, cmd *cli.Command) error {
802-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
836+
workingDir := "."
837+
if cmd.NArg() > 0 {
838+
workingDir = cmd.Args().First()
839+
}
840+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
803841
if err != nil {
804842
return err
805843
}
@@ -840,7 +878,11 @@ func deleteAgent(ctx context.Context, cmd *cli.Command) error {
840878
}
841879

842880
func listAgentVersions(ctx context.Context, cmd *cli.Command) error {
843-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
881+
workingDir := "."
882+
if cmd.NArg() > 0 {
883+
workingDir = cmd.Args().First()
884+
}
885+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
844886
if err != nil {
845887
return err
846888
}
@@ -912,7 +954,11 @@ func listAgents(ctx context.Context, cmd *cli.Command) error {
912954
}
913955

914956
func listAgentSecrets(ctx context.Context, cmd *cli.Command) error {
915-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
957+
workingDir := "."
958+
if cmd.NArg() > 0 {
959+
workingDir = cmd.Args().First()
960+
}
961+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
916962
if err != nil {
917963
return err
918964
}
@@ -938,7 +984,11 @@ func listAgentSecrets(ctx context.Context, cmd *cli.Command) error {
938984
}
939985

940986
func updateAgentSecrets(ctx context.Context, cmd *cli.Command) error {
941-
agentName, err := getAgentName(cmd, ".", cmd.String("toml"))
987+
workingDir := "."
988+
if cmd.NArg() > 0 {
989+
workingDir = cmd.Args().First()
990+
}
991+
agentName, err := getAgentName(cmd, workingDir, cmd.String("toml"))
942992
if err != nil {
943993
return err
944994
}

cmd/lk/utils.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ var (
6666
Name: "project",
6767
Usage: "`NAME` of a configured project",
6868
},
69+
&cli.StringFlag{
70+
Name: "subdomain",
71+
Usage: "`SUBDOMAIN` of a configured project",
72+
},
6973
&cli.BoolFlag{
7074
Name: "curl",
7175
Usage: "Print curl commands for API actions",
@@ -171,6 +175,17 @@ func loadProjectDetails(c *cli.Command, opts ...loadOption) (*config.ProjectConf
171175
return pc, nil
172176
}
173177

178+
// if explicit subdomain is provided, use it
179+
if c.String("subdomain") != "" {
180+
pc, err := config.LoadProjectBySubdomain(c.String("subdomain"))
181+
if err != nil {
182+
return nil, err
183+
}
184+
fmt.Println("Using project [" + util.Theme.Focused.Title.Render(pc.Name) + "]")
185+
logDetails(c, pc)
186+
return pc, nil
187+
}
188+
174189
pc := &config.ProjectConfig{}
175190
if val := c.String("url"); val != "" {
176191
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)