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
58 changes: 58 additions & 0 deletions pkg/cmd/listdeployments.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package cmd

import (
"context"
"fmt"
"os"

"github.com/SwissDataScienceCenter/renku-dev-utils/pkg/github"
"github.com/SwissDataScienceCenter/renku-dev-utils/pkg/k8s"
"github.com/spf13/cobra"
)

var listDeploymentsCmd = &cobra.Command{
Use: "list-deployments",
Aliases: []string{"lsd"},
Short: "List renku deployments",
Run: listDeployments,
}

func listDeployments(cmd *cobra.Command, args []string) {
ctx := cmd.Context()
if ctx == nil {
ctx = context.Background()
}

cli, err := github.NewGitHubCLI("")
if err != nil {
fmt.Println(err)
os.Exit(1)
}

clients, err := k8s.GetClientset()
if err != nil {
fmt.Println(err)
os.Exit(1)
}

namespaceList, err := k8s.ListNamespaces(ctx, clients)
if err != nil {
fmt.Println(err)
os.Exit(1)
}

for i := range namespaceList.Items {
ns := namespaceList.Items[i]
repo, pr := github.MatchDeploymentNamespace(ns.Name)
if repo != "" {
state, err := cli.GetPullRequestState(ctx, repo, pr)
if err != nil {
state = "UNKNOWN"
fmt.Println(err)
}
fmt.Printf("%s\t%s\t%d\t%s\n", ns.Name, repo, pr, state)
} else {
fmt.Printf("%s\n", ns.Name)
}
}
}
1 change: 1 addition & 0 deletions pkg/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ func preRunRoot(cmd *cobra.Command, args []string) error {
func init() {
rootCmd.AddCommand(cleanupDeploymentCmd)
rootCmd.AddCommand(copyKeycloakAdminPasswordCmd)
rootCmd.AddCommand(listDeploymentsCmd)
rootCmd.AddCommand(loginCmd)
rootCmd.AddCommand(logoutCmd)
rootCmd.AddCommand(makeMeAdminCmd)
Expand Down
20 changes: 20 additions & 0 deletions pkg/github/pullrequest.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package github
import (
"context"
"encoding/json"
"fmt"
)

func (cli *GitHubCLI) GetCurrentPullRequest(ctx context.Context) (int, error) {
Expand All @@ -23,3 +24,22 @@ func (cli *GitHubCLI) GetCurrentPullRequest(ctx context.Context) (int, error) {
type gitHubPRViewOutput struct {
Number int `json:"number"`
}

func (cli *GitHubCLI) GetPullRequestState(ctx context.Context, repository string, pr int) (state string, err error) {
out, err := cli.RunCmd(ctx, "pr", "view", "--repo", repository, "--json", "state", fmt.Sprintf("%d", pr))
if err != nil {
return "", err
}

var res gitHubPRViewStateOutput
err = json.Unmarshal(out, &res)
if err != nil {
return "", err
}

return res.State, nil
}

type gitHubPRViewStateOutput struct {
State string `json:"state"`
}
54 changes: 53 additions & 1 deletion pkg/github/utils.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
package github

import "fmt"
import (
"fmt"
"regexp"
"strconv"
)

// Maps repositories to namespace templates
var repoToNamespaceTemplateMap map[string]string

// Deployment namespace regexes
var namespaceRegexes []namespaceRegex

// Contains the list of Renku global images
var globalImagesSlice []string

Expand All @@ -20,9 +27,28 @@ func GetGlobalImages() []string {
return globalImagesSlice[:]
}

func MatchDeploymentNamespace(namespace string) (repository string, pr int) {
for i := range namespaceRegexes {
res := namespaceRegexes[i].regex.FindStringSubmatch(namespace)
if res != nil {
pr, err := strconv.Atoi(res[1])
if err == nil && pr > 0 {
return namespaceRegexes[i].repository, pr
}
}
}
return "", 0
}

type namespaceRegex struct {
regex *regexp.Regexp
repository string
}

func init() {
initRepoToNamespaceTemplateMap()
initGlobalImagesSlice()
initNamespaceRegexes()
}

func initRepoToNamespaceTemplateMap() {
Expand All @@ -31,6 +57,32 @@ func initRepoToNamespaceTemplateMap() {
"SwissDataScienceCenter/renku": "ci-renku-%d",
"SwissDataScienceCenter/renku-data-services": "renku-ci-ds-%d",
"SwissDataScienceCenter/renku-ui": "renku-ci-ui-%d",
"SwissDataScienceCenter/renku-gateway": "renku-ci-gw-%d",
}
}

func initNamespaceRegexes() {
namespaceRegexes = []namespaceRegex{
{
regex: regexp.MustCompile(`^renku-ci-am-(\d+)$`),
repository: "SwissDataScienceCenter/amalthea",
},
{
regex: regexp.MustCompile(`^ci-renku-(\d+)$`),
repository: "SwissDataScienceCenter/renku",
},
{
regex: regexp.MustCompile(`^renku-ci-ds-(\d+)$`),
repository: "SwissDataScienceCenter/renku-data-services",
},
{
regex: regexp.MustCompile(`^renku-ci-ui-(\d+)$`),
repository: "SwissDataScienceCenter/renku-ui",
},
{
regex: regexp.MustCompile(`^renku-ci-gw-(\d+)$`),
repository: "SwissDataScienceCenter/renku-gateway",
},
}
}

Expand Down
13 changes: 13 additions & 0 deletions pkg/k8s/namespace.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package k8s

import (
"context"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
)

func ListNamespaces(ctx context.Context, clients *kubernetes.Clientset) (namespaceList *corev1.NamespaceList, err error) {
return clients.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
}
Loading