@@ -3,20 +3,31 @@ package command
3
3
import (
4
4
"context"
5
5
"fmt"
6
- "os"
7
6
"time"
8
7
8
+ "github.com/urfave/cli"
9
+
10
+ apiv1 "github.com/leptonai/gpud/api/v1"
9
11
client "github.com/leptonai/gpud/client/v1"
10
12
"github.com/leptonai/gpud/pkg/config"
11
- gpud_state "github.com/leptonai/gpud/pkg/gpud-state"
13
+ gpudstate "github.com/leptonai/gpud/pkg/gpud-state"
12
14
"github.com/leptonai/gpud/pkg/login"
13
15
"github.com/leptonai/gpud/pkg/server"
14
16
"github.com/leptonai/gpud/pkg/sqlite"
15
-
16
- "github.com/urfave/cli"
17
17
)
18
18
19
19
func cmdLogin (cliContext * cli.Context ) error {
20
+ token := cliContext .String ("token" )
21
+ if token == "" {
22
+ fmt .Print ("Please visit https://dashboard.lepton.ai/ under Settings/Tokens to fetch your token\n Please enter your token:" )
23
+ if _ , err := fmt .Scanln (& token ); err != nil && err .Error () != "unexpected newline" {
24
+ return fmt .Errorf ("failed reading input: %w" , err )
25
+ }
26
+ }
27
+ if token == "" {
28
+ return ErrEmptyToken
29
+ }
30
+
20
31
rootCtx , rootCancel := context .WithTimeout (context .Background (), 2 * time .Minute )
21
32
defer rootCancel ()
22
33
@@ -31,75 +42,54 @@ func cmdLogin(cliContext *cli.Context) error {
31
42
if err != nil {
32
43
return fmt .Errorf ("failed to get state file: %w" , err )
33
44
}
34
-
35
- dbRW , err := sqlite .Open (stateFile )
36
- if err != nil {
37
- return fmt .Errorf ("failed to open state file: %w" , err )
38
- }
39
- defer dbRW .Close ()
40
-
41
45
dbRO , err := sqlite .Open (stateFile , sqlite .WithReadOnly (true ))
42
46
if err != nil {
43
47
return fmt .Errorf ("failed to open state file: %w" , err )
44
48
}
45
49
defer dbRO .Close ()
46
50
47
- uid , err := gpud_state . CreateMachineIDIfNotExist (rootCtx , dbRW , dbRO , "" )
51
+ machineID , err := gpudstate . ReadMachineID (rootCtx , dbRO )
48
52
if err != nil {
49
- return fmt . Errorf ( "failed to get machine uid: %w" , err )
53
+ return err
50
54
}
51
-
52
- components , err := gpud_state .GetComponents (rootCtx , dbRO , uid )
53
- if err != nil {
54
- return fmt .Errorf ("failed to get components: %w" , err )
55
+ if machineID != "" {
56
+ fmt .Printf ("machine ID %s already assigned (skipping login)\n " , machineID )
57
+ return nil
55
58
}
56
59
57
- cliToken := cliContext .String ("token" )
58
60
endpoint := cliContext .String ("endpoint" )
59
61
60
- dbToken , _ := gpud_state .GetLoginInfo (rootCtx , dbRO , uid )
61
- token := dbToken
62
- if cliToken != "" {
63
- token = cliToken
64
- } else {
65
- fmt .Println ("trying token from local store, if you want to override, use --token flag" )
62
+ // machine ID has not been assigned yet
63
+ // thus request one and blocks until the login request is processed
64
+ loginResp , err := login .SendRequest (rootCtx , endpoint , apiv1.LoginRequest {Token : token })
65
+ if err != nil {
66
+ return err
66
67
}
68
+ machineID = loginResp .MachineID
67
69
68
- if token == "" {
69
- fmt .Print ("Please visit https://dashboard.lepton.ai/ under Settings/Tokens to fetch your token\n Please enter your token:" )
70
- if _ , err := fmt .Scanln (& token ); err != nil && err .Error () != "unexpected newline" {
71
- return fmt .Errorf ("failed reading input: %w" , err )
72
- }
70
+ // consume the login response to persist the machine ID
71
+ dbRW , err := sqlite .Open (stateFile )
72
+ if err != nil {
73
+ return fmt .Errorf ("failed to open state file: %w" , err )
74
+ }
75
+ defer dbRW .Close ()
76
+ if err := gpudstate .RecordMachineID (rootCtx , dbRW , dbRO , machineID ); err != nil {
77
+ return fmt .Errorf ("failed to record machine ID: %w" , err )
73
78
}
74
79
75
80
fifoFile , err := config .DefaultFifoFile ()
76
81
if err != nil {
77
82
return fmt .Errorf ("failed to get fifo file: %w" , err )
78
83
}
79
84
80
- if token != "" && endpoint != "" {
81
- hostname , err := os .Hostname ()
82
- if err != nil {
83
- hostname = "UnknownName"
84
- }
85
- if err := login .Login (hostname , token , endpoint , components , uid ); err != nil {
86
- return err
87
- }
88
- } else {
89
- fmt .Println ("login skipped since token or endpoint not provided..." )
90
- return nil
91
- }
92
-
93
85
if err := server .WriteToken (token , fifoFile ); err != nil {
94
86
return fmt .Errorf ("failed to write token: %v" , err )
95
87
}
96
88
97
- if token != dbToken {
98
- if err = gpud_state .UpdateLoginInfo (rootCtx , dbRW , uid , token ); err != nil {
99
- fmt .Println ("machine logged in but failed to update token:" , err )
100
- }
89
+ if err = gpudstate .UpdateLoginInfo (rootCtx , dbRW , machineID , token ); err != nil {
90
+ fmt .Println ("machine logged in but failed to update token:" , err )
101
91
}
102
92
103
- fmt .Printf ("%s successfully logged into lepton.ai \n " , checkMark )
93
+ fmt .Printf ("%s successfully logged in with machine id %s \n " , checkMark , loginResp . MachineID )
104
94
return nil
105
95
}
0 commit comments