Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,17 @@ check-format: ## Check that sources are correctly formatted
.PHONY: check-vet
check-vet: ## Check source files with `go vet`
go vet ./...

##@ Code generation

.PHONY: renku-users-apispec
renku-users-apispec: ## Download the "users" API spec
curl -L -o pkg/renkuapi/users/api.spec.yaml https://raw.githubusercontent.com/SwissDataScienceCenter/renku-data-services/refs/heads/main/components/renku_data_services/users/api.spec.yaml
sed -e 's/- default: "general"//g' pkg/renkuapi/users/api.spec.yaml > pkg/renkuapi/users/api.spec.new.yaml
mv pkg/renkuapi/users/api.spec.new.yaml pkg/renkuapi/users/api.spec.yaml

.PHONY: generate
generate: pkg/renkuapi/users/users_gen.go ## Run go generate

pkg/renkuapi/users/users_gen.go: pkg/renkuapi/users/api.spec.yaml
go generate pkg/renkuapi/users/users.go
27 changes: 25 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,33 @@ module github.com/SwissDataScienceCenter/renku-dev-utils

go 1.24.2

tool github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen

require (
github.com/getkin/kin-openapi v0.132.0
github.com/golang-jwt/jwt/v5 v5.3.0
github.com/oapi-codegen/runtime v1.1.2
github.com/spf13/cobra v1.10.1
github.com/zalando/go-keyring v0.2.6
golang.design/x/clipboard v0.7.1
k8s.io/api v0.34.1
k8s.io/apimachinery v0.34.1
k8s.io/client-go v0.34.1
)

require (
al.essio.dev/pkg/shellescape v1.5.1 // indirect
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/danieljoos/wincred v1.2.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 // indirect
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.20.2 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/gnostic-models v0.7.0 // indirect
github.com/google/uuid v1.6.0 // indirect
Expand All @@ -27,24 +38,36 @@ require (
github.com/mailru/easyjson v0.7.7 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/oapi-codegen/oapi-codegen/v2 v2.5.0 // indirect
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect
github.com/perimeterx/marshmallow v1.1.5 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/speakeasy-api/jsonpath v0.6.0 // indirect
github.com/speakeasy-api/openapi-overlay v0.10.2 // indirect
github.com/spf13/pflag v1.0.9 // indirect
github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56 // indirect
golang.org/x/image v0.28.0 // indirect
golang.org/x/mobile v0.0.0-20250606033058-a2a15c67f36f // indirect
golang.org/x/net v0.38.0 // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/oauth2 v0.27.0 // indirect
golang.org/x/sync v0.15.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.30.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
golang.org/x/time v0.9.0 // indirect
golang.org/x/tools v0.34.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect
Expand Down
140 changes: 136 additions & 4 deletions go.sum

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions pkg/cmd/cleanupdeployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,10 @@ func askForConfirmation(question string) (response bool, err error) {
return false, err
}
res = strings.ToLower(strings.TrimSpace(res))
if res == "yes" {
switch res {
case "yes":
return true, nil
} else if res == "no" {
case "no":
return false, nil
}
return false, fmt.Errorf("Invalid answer, aborting.")
Expand Down
94 changes: 94 additions & 0 deletions pkg/cmd/login.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package cmd

import (
"context"
"fmt"
"os"

"github.com/SwissDataScienceCenter/renku-dev-utils/pkg/github"
ns "github.com/SwissDataScienceCenter/renku-dev-utils/pkg/namespace"
"github.com/SwissDataScienceCenter/renku-dev-utils/pkg/renkuapi"
"github.com/SwissDataScienceCenter/renku-dev-utils/pkg/renkuapi/users"
"github.com/spf13/cobra"
)

var loginCmd = &cobra.Command{
Use: "login",
Short: "Log in to a renku instance",
Run: login,
}

func login(cmd *cobra.Command, args []string) {
ctx := context.Background()

url, err := cmd.Flags().GetString("url")
if err != nil {
fmt.Println(err)
os.Exit(1)
}

if url == "" {
namespace, err := cmd.Flags().GetString("namespace")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if namespace == "" {
cli, err := github.NewGitHubCLI("")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
namespace, err = ns.FindCurrentNamespace(ctx, cli)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}

deploymentURL, err := ns.GetDeploymentURL(namespace)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
url = deploymentURL.String()
}

fmt.Printf("Renku URL: %s\n", url)

auth, err := renkuapi.NewRenkuApiAuth(url)
if err != nil {
fmt.Println(err)
os.Exit(1)
}

err = auth.Login(ctx)
if err != nil {
fmt.Println(err)
os.Exit(1)
}

ruc, err := users.NewRenkuUsersClient(url, users.WithRequestEditors(users.RequestEditorFn(auth.RequestEditor())))
if err != nil {
fmt.Println(err)
os.Exit(1)
}

userInfo, err := ruc.GetUser(ctx)
if err != nil {
fmt.Println(err)
os.Exit(1)
}

fmt.Println("Logged in as:")
fmt.Printf(" username: %s\n", userInfo.Username)
fmt.Printf(" email: %s\n", *userInfo.Email)
fmt.Printf(" first name: %s\n", *userInfo.FirstName)
fmt.Printf(" last name: %s\n", *userInfo.LastName)
fmt.Printf(" is admin: %t\n", userInfo.IsAdmin)
}

func init() {
loginCmd.Flags().String("url", "", "instance URL")
loginCmd.Flags().StringP("namespace", "n", "", "k8s namespace")
}
89 changes: 89 additions & 0 deletions pkg/cmd/logout.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package cmd

import (
"context"
"fmt"
"os"

"github.com/SwissDataScienceCenter/renku-dev-utils/pkg/github"
ns "github.com/SwissDataScienceCenter/renku-dev-utils/pkg/namespace"
"github.com/SwissDataScienceCenter/renku-dev-utils/pkg/renkuapi"
"github.com/spf13/cobra"
)

var logoutCmd = &cobra.Command{
Use: "logout",
Short: "Log out of a renku instance",
Run: logout,
}

func logout(cmd *cobra.Command, args []string) {
ctx := context.Background()

logoutAll, err := cmd.Flags().GetBool("all")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if logoutAll {
err := renkuapi.LogoutAll(ctx)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
return
}

url, err := cmd.Flags().GetString("url")
if err != nil {
fmt.Println(err)
os.Exit(1)
}

if url == "" {
namespace, err := cmd.Flags().GetString("namespace")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if namespace == "" {
cli, err := github.NewGitHubCLI("")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
namespace, err = ns.FindCurrentNamespace(ctx, cli)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}

deploymentURL, err := ns.GetDeploymentURL(namespace)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
url = deploymentURL.String()
}

fmt.Printf("Renku URL: %s\n", url)

auth, err := renkuapi.NewRenkuApiAuth(url)
if err != nil {
fmt.Println(err)
os.Exit(1)
}

err = auth.Logout(ctx)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}

func init() {
logoutCmd.Flags().String("url", "", "instance URL")
logoutCmd.Flags().StringP("namespace", "n", "", "k8s namespace")
logoutCmd.Flags().Bool("all", false, "remove all saved logins")
}
2 changes: 2 additions & 0 deletions pkg/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ func runRoot(cmd *cobra.Command, args []string) error {
func init() {
rootCmd.AddCommand(cleanupDeploymentCmd)
rootCmd.AddCommand(copyKeycloakAdminPasswordCmd)
rootCmd.AddCommand(loginCmd)
rootCmd.AddCommand(logoutCmd)
rootCmd.AddCommand(makeMeAdminCmd)
rootCmd.AddCommand(namespaceCmd)
rootCmd.AddCommand(openDeploymentCmd)
Expand Down
1 change: 0 additions & 1 deletion pkg/keycloak/rest.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@ func (client *KeycloakClient) PostForm(ctx context.Context, url string, data url
}

return resp, nil

}

func tryParseResponse(resp *http.Response, result any) error {
Expand Down
Loading