From a79f1839fc03d7bc5923e9519d7e510b1178a355 Mon Sep 17 00:00:00 2001 From: Flora Thiebaut Date: Tue, 20 May 2025 10:49:54 +0200 Subject: [PATCH] feat: add open command to view a deployment --- pkg/cmd/opendeployment.go | 74 +++++++++++++++++++++++++++++++++++ pkg/cmd/root.go | 1 + pkg/executils/formatoutput.go | 15 +++++++ pkg/github/cli.go | 4 +- pkg/helm/cli.go | 4 +- 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 pkg/cmd/opendeployment.go create mode 100644 pkg/executils/formatoutput.go diff --git a/pkg/cmd/opendeployment.go b/pkg/cmd/opendeployment.go new file mode 100644 index 0000000..b292d7c --- /dev/null +++ b/pkg/cmd/opendeployment.go @@ -0,0 +1,74 @@ +package cmd + +import ( + "context" + "fmt" + "net/url" + "os" + "os/exec" + "runtime" + + "github.com/SwissDataScienceCenter/renku-dev-utils/pkg/executils" + "github.com/SwissDataScienceCenter/renku-dev-utils/pkg/github" + ns "github.com/SwissDataScienceCenter/renku-dev-utils/pkg/namespace" + "github.com/spf13/cobra" +) + +var openDeploymentCmd = &cobra.Command{ + Use: "open", + Short: "Open a renku deployment in the browser", + Run: openDeployment, +} + +func openDeployment(cmd *cobra.Command, args []string) { + ctx := context.Background() + + 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) + } + } + + // TODO: Can we derive the URL by inspecting ingresses in the k8s namespace? + openURL, err := url.Parse(fmt.Sprintf("https://%s.dev.renku.ch", namespace)) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + openURLStr := openURL.String() + fmt.Printf("Open URL: %s\n", openURLStr) + + if runtime.GOOS == "darwin" { + cmd := exec.CommandContext(ctx, "open", openURLStr) + _, err = executils.FormatOutput(cmd.Output()) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + return + } + + if runtime.GOOS == "linux" { + cmd := exec.CommandContext(ctx, "xdg-open", openURLStr) + _, err = executils.FormatOutput(cmd.Output()) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + return + } + + fmt.Printf("Sorry, I do not know how to \"open\" on '%s'\n", runtime.GOOS) + os.Exit(1) +} + +func init() { + openDeploymentCmd.Flags().StringVarP(&namespace, "namespace", "n", "", "k8s namespace") +} diff --git a/pkg/cmd/root.go b/pkg/cmd/root.go index 699e8bb..561accd 100644 --- a/pkg/cmd/root.go +++ b/pkg/cmd/root.go @@ -30,6 +30,7 @@ func runRoot(cmd *cobra.Command, args []string) error { func init() { rootCmd.AddCommand(cleanupDeploymentCmd) rootCmd.AddCommand(copyKeycloakAdminPasswordCmd) + rootCmd.AddCommand(openDeploymentCmd) rootCmd.AddCommand(versionCmd) } diff --git a/pkg/executils/formatoutput.go b/pkg/executils/formatoutput.go new file mode 100644 index 0000000..2d61c87 --- /dev/null +++ b/pkg/executils/formatoutput.go @@ -0,0 +1,15 @@ +package executils + +import ( + "fmt" + "os/exec" +) + +func FormatOutput(output []byte, err error) ([]byte, error) { + if err != nil { + if ee, ok := err.(*exec.ExitError); ok { + return output, fmt.Errorf("%s", string(ee.Stderr)) + } + } + return output, err +} diff --git a/pkg/github/cli.go b/pkg/github/cli.go index f6b1bb6..4e349ac 100644 --- a/pkg/github/cli.go +++ b/pkg/github/cli.go @@ -4,6 +4,8 @@ import ( "context" "fmt" "os/exec" + + "github.com/SwissDataScienceCenter/renku-dev-utils/pkg/executils" ) type GitHubCLI struct { @@ -27,5 +29,5 @@ func NewGitHubCLI(gh string) (*GitHubCLI, error) { func (cli *GitHubCLI) RunCmd(ctx context.Context, arg ...string) ([]byte, error) { cmd := exec.CommandContext(ctx, cli.gh, arg...) - return cmd.Output() + return executils.FormatOutput(cmd.Output()) } diff --git a/pkg/helm/cli.go b/pkg/helm/cli.go index ef8d03b..68b2450 100644 --- a/pkg/helm/cli.go +++ b/pkg/helm/cli.go @@ -4,6 +4,8 @@ import ( "context" "fmt" "os/exec" + + "github.com/SwissDataScienceCenter/renku-dev-utils/pkg/executils" ) type HelmCLI struct { @@ -27,5 +29,5 @@ func NewHelmCLI(helm string) (cli *HelmCLI, err error) { func (cli *HelmCLI) RunCmd(ctx context.Context, arg ...string) ([]byte, error) { cmd := exec.CommandContext(ctx, cli.helm, arg...) - return cmd.Output() + return executils.FormatOutput(cmd.Output()) }