Skip to content

Commit 1fd8074

Browse files
committed
feat: add login and token command
1 parent aa4029d commit 1fd8074

File tree

7 files changed

+143
-2
lines changed

7 files changed

+143
-2
lines changed

go.mod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,22 @@ go 1.24.2
44

55
require (
66
github.com/spf13/cobra v1.10.1
7+
github.com/zalando/go-keyring v0.2.6
78
k8s.io/api v0.34.0
89
k8s.io/apimachinery v0.34.0
910
)
1011

1112
require (
13+
al.essio.dev/pkg/shellescape v1.5.1 // indirect
14+
github.com/danieljoos/wincred v1.2.2 // indirect
1215
github.com/davecgh/go-spew v1.1.1 // indirect
1316
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
1417
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
1518
github.com/go-logr/logr v1.4.2 // indirect
1619
github.com/go-openapi/jsonpointer v0.21.0 // indirect
1720
github.com/go-openapi/jsonreference v0.20.2 // indirect
1821
github.com/go-openapi/swag v0.23.0 // indirect
22+
github.com/godbus/dbus/v5 v5.1.0 // indirect
1923
github.com/gogo/protobuf v1.3.2 // indirect
2024
github.com/google/gnostic-models v0.7.0 // indirect
2125
github.com/google/uuid v1.6.0 // indirect

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho=
2+
al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
13
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
24
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
35
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
6+
github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0=
7+
github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8=
48
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
59
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
610
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -20,6 +24,8 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr
2024
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
2125
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
2226
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
27+
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
28+
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
2329
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
2430
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
2531
github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
@@ -29,6 +35,8 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX
2935
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
3036
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
3137
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
38+
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
39+
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
3240
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
3341
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
3442
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
@@ -86,6 +94,8 @@ github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
8694
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
8795
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
8896
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
97+
github.com/zalando/go-keyring v0.2.6 h1:r7Yc3+H+Ux0+M72zacZoItR3UDxeWfKTcabvkI8ua9s=
98+
github.com/zalando/go-keyring v0.2.6/go.mod h1:2TCrxYrbUNYfNS/Kgy/LSrkSQzZ5UPVH85RwfczwvcI=
8999
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
90100
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
91101
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=

pkg/cmd/cleanupdeployment.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,10 @@ func askForConfirmation(question string) (response bool, err error) {
138138
return false, err
139139
}
140140
res = strings.ToLower(strings.TrimSpace(res))
141-
if res == "yes" {
141+
switch res {
142+
case "yes":
142143
return true, nil
143-
} else if res == "no" {
144+
case "no":
144145
return false, nil
145146
}
146147
return false, fmt.Errorf("Invalid answer, aborting.")

pkg/cmd/login.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package cmd
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
8+
"github.com/SwissDataScienceCenter/renku-dev-utils/pkg/github"
9+
ns "github.com/SwissDataScienceCenter/renku-dev-utils/pkg/namespace"
10+
"github.com/SwissDataScienceCenter/renku-dev-utils/pkg/renkuapi"
11+
"github.com/spf13/cobra"
12+
)
13+
14+
var loginCmd = &cobra.Command{
15+
Use: "login",
16+
Short: "Log in to a renku instance",
17+
Run: login,
18+
}
19+
20+
func login(cmd *cobra.Command, args []string) {
21+
ctx := context.Background()
22+
23+
url, err := cmd.Flags().GetString("url")
24+
if err != nil {
25+
fmt.Println(err)
26+
os.Exit(1)
27+
}
28+
29+
if url == "" {
30+
namespace, err := cmd.Flags().GetString("namespace")
31+
if err != nil {
32+
fmt.Println(err)
33+
os.Exit(1)
34+
}
35+
if namespace == "" {
36+
cli, err := github.NewGitHubCLI("")
37+
if err != nil {
38+
fmt.Println(err)
39+
os.Exit(1)
40+
}
41+
namespace, err = ns.FindCurrentNamespace(ctx, cli)
42+
if err != nil {
43+
fmt.Println(err)
44+
os.Exit(1)
45+
}
46+
}
47+
48+
deploymentURL, err := ns.GetDeploymentURL(namespace)
49+
if err != nil {
50+
fmt.Println(err)
51+
os.Exit(1)
52+
}
53+
url = deploymentURL.String()
54+
}
55+
56+
fmt.Printf("URL '%s'\n", url)
57+
58+
auth, err := renkuapi.NewRenkuApiAuth(url)
59+
if err != nil {
60+
fmt.Println(err)
61+
os.Exit(1)
62+
}
63+
64+
auth.GetAccessToken()
65+
}
66+
67+
func init() {
68+
loginCmd.Flags().String("url", "", "instance URL")
69+
loginCmd.Flags().StringP("namespace", "n", "", "k8s namespace")
70+
}

pkg/cmd/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ func runRoot(cmd *cobra.Command, args []string) error {
3333
func init() {
3434
rootCmd.AddCommand(cleanupDeploymentCmd)
3535
rootCmd.AddCommand(copyKeycloakAdminPasswordCmd)
36+
rootCmd.AddCommand(loginCmd)
3637
rootCmd.AddCommand(makeMeAdminCmd)
3738
rootCmd.AddCommand(namespaceCmd)
3839
rootCmd.AddCommand(openDeploymentCmd)

pkg/renkuapi/auth.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package renkuapi
2+
3+
import (
4+
"fmt"
5+
"net/url"
6+
7+
"github.com/zalando/go-keyring"
8+
)
9+
10+
type RenkuApiAuth struct {
11+
baseURL *url.URL
12+
issuerURL *url.URL
13+
}
14+
15+
func NewRenkuApiAuth(baseURL string) (auth *RenkuApiAuth, err error) {
16+
parsedURL, err := url.Parse(baseURL)
17+
if err != nil {
18+
return nil, err
19+
}
20+
if parsedURL.EscapedPath() == "/" {
21+
parsedURL.Path = ""
22+
}
23+
auth = &RenkuApiAuth{
24+
baseURL: parsedURL,
25+
}
26+
if auth.issuerURL == nil {
27+
auth.issuerURL = parsedURL.JoinPath("auth/realms/Renku")
28+
}
29+
return auth, nil
30+
}
31+
32+
func (auth *RenkuApiAuth) GetAccessToken() (token string, err error) {
33+
token, err = auth.getAccessTokenFromKeyring()
34+
fmt.Println(token)
35+
fmt.Println(err)
36+
37+
return "", fmt.Errorf("not implemented")
38+
}
39+
40+
func (auth *RenkuApiAuth) getAccessTokenFromKeyring() (token string, err error) {
41+
kUser := fmt.Sprintf("%s:%s", auth.getKeyringUserPrefix(), "access_token")
42+
return keyring.Get(keyringService, kUser)
43+
}
44+
45+
func (auth *RenkuApiAuth) getRefreshTokenFromKeyring() (token string, err error) {
46+
kUser := fmt.Sprintf("%s:%s", auth.getKeyringUserPrefix(), "refresh_token")
47+
return keyring.Get(keyringService, kUser)
48+
}
49+
50+
func (auth *RenkuApiAuth) getKeyringUserPrefix() string {
51+
return fmt.Sprintf("rdu:%s", auth.baseURL.String())
52+
}

pkg/renkuapi/constants.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package renkuapi
2+
3+
const keyringService string = "renku-dev-utils"

0 commit comments

Comments
 (0)