Skip to content
This repository has been archived by the owner on Jul 25, 2022. It is now read-only.

Commit

Permalink
add support for target url or target -u with dashboard url
Browse files Browse the repository at this point in the history
  • Loading branch information
neo-liang-sap committed Apr 21, 2020
1 parent 6dfcae2 commit 9ed975f
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 14 deletions.
92 changes: 81 additions & 11 deletions pkg/cmd/target.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"net/url"
"os"
"path/filepath"
"regexp"
"strings"

gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1"
Expand All @@ -38,22 +39,23 @@ import (
const ProjectName = "project.garden.sapcloud.io/name"

var (
pgarden string
pproject string
pseed string
pshoot string
pnamespace string
pserver string
pgarden string
pproject string
pseed string
pshoot string
pnamespace string
pserver string
pdashboardurl string
)

// NewTargetCmd returns a new target command.
func NewTargetCmd(targetReader TargetReader, targetWriter TargetWriter, configReader ConfigReader, ioStreams IOStreams, kubeconfigReader KubeconfigReader) *cobra.Command {
cmd := &cobra.Command{
Use: "target <project|garden|seed|shoot|namespace|server> NAME",
Use: "target <project|garden|seed|shoot|namespace|server|dashboardUrl> NAME",
Short: "Set scope for next operations",
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
if pgarden != "" || pproject != "" || pseed != "" || pshoot != "" || pnamespace != "" || pserver != "" {
if pgarden != "" || pproject != "" || pseed != "" || pshoot != "" || pnamespace != "" || pserver != "" || pdashboardurl != "" {
var arguments []string
if pgarden != "" && pserver != "" {
fmt.Println("server and garden values can't be specified at same time.")
Expand Down Expand Up @@ -95,10 +97,15 @@ func NewTargetCmd(targetReader TargetReader, targetWriter TargetWriter, configRe
err := namespaceWrapper(targetReader, targetWriter, pnamespace)
checkError(err)
}

if pdashboardurl != "" {
err := urlWrapper(targetReader, targetWriter, configReader, ioStreams, pdashboardurl)
checkError(err)
}
return nil
}
if len(args) < 1 && pgarden == "" && pproject == "" && pseed == "" && pshoot == "" && pnamespace == "" && pserver == "" || len(args) > 5 {
return errors.New("command must be in the format: target <project|garden|seed|shoot|namespace|server> NAME")
if len(args) < 1 && pgarden == "" && pproject == "" && pseed == "" && pshoot == "" && pnamespace == "" && pserver == "" && pdashboardurl == "" || len(args) > 5 {
return errors.New("command must be in the format: target <project|garden|seed|shoot|namespace|server|dashboardUrl> NAME")
}
switch args[0] {
case "garden":
Expand Down Expand Up @@ -143,6 +150,19 @@ func NewTargetCmd(targetReader TargetReader, targetWriter TargetWriter, configRe
if err != nil {
return err
}
case "dashboardUrl":
if len(args) != 2 || args[1] == "" {
return errors.New("command must be in the format: target dashboardUrl URL")
}
if !isValidURI(args[1]) {
fmt.Println("the server name must be a valid uri")
os.Exit(2)
}

err := urlWrapper(targetReader, targetWriter, configReader, ioStreams, args[1])
if err != nil {
return err
}

default:
target := targetReader.ReadTarget(pathTarget)
Expand Down Expand Up @@ -250,7 +270,7 @@ func NewTargetCmd(targetReader TargetReader, targetWriter TargetWriter, configRe
}
return nil
},
ValidArgs: []string{"project", "garden", "seed", "shoot", "namespace", "server"},
ValidArgs: []string{"project", "garden", "seed", "shoot", "namespace", "server", "dashboardUrl"},
}

cmd.PersistentFlags().StringVarP(&pgarden, "garden", "g", "", "garden name")
Expand All @@ -259,6 +279,7 @@ func NewTargetCmd(targetReader TargetReader, targetWriter TargetWriter, configRe
cmd.PersistentFlags().StringVarP(&pshoot, "shoot", "t", "", "shoot name")
cmd.PersistentFlags().StringVarP(&pnamespace, "namespace", "n", "", "namespace name")
cmd.PersistentFlags().StringVarP(&pserver, "server", "r", "", "server name")
cmd.PersistentFlags().StringVarP(&pdashboardurl, "dashboardUrl", "u", "", "dashboard url name")

return cmd
}
Expand Down Expand Up @@ -345,6 +366,22 @@ func resolveNameGarden(reader ConfigReader, name string) (matches []string) {
return matches
}

// resolveGardenNameFromURL resolve garden name from provided dashboard URL
func resolveGardenNameFromURL(reader ConfigReader, dashboardURL string) string {
config := reader.ReadConfig(pathGardenConfig)
gardenName := ""
for _, garden := range config.GardenClusters {
if strings.Contains(garden.DashboardURL, dashboardURL) {
gardenName = garden.Name
}
}
if gardenName == "" {
fmt.Println("a garden could not be matched for the provided dashboard url")
os.Exit(2)
}
return gardenName
}

// targetGarden targets kubeconfig file of garden cluster
func targetGarden(targetWriter TargetWriter, name string) {
target := &Target{
Expand Down Expand Up @@ -1020,6 +1057,39 @@ func namespaceWrapper(targetReader TargetReader, targetWriter TargetWriter, kube
return nil
}

//urlWrapper function target garden and shoot in dashboard url

func urlWrapper(targetReader TargetReader, targetWriter TargetWriter, configReader ConfigReader, ioStreams IOStreams, urlString string) error {
shootName := ""
u, err := url.Parse(urlString)
if err != nil {
fmt.Println("the URL enter is invalid")
os.Exit(2)
}

gardenName := resolveGardenNameFromURL(configReader, u.Host)

re, _ := regexp.Compile(`\/namespace\/[a-z0-9-]*\/shoots\/([a-z0-9-]*)`)
values := re.FindStringSubmatch(u.Path)
if len(values) > 0 {
shootName = values[1]
}

if shootName == "" {
fmt.Println("could not get an valid shoot name from provided URL")
os.Exit(2)
}

gardenArgs := []string{"garden", gardenName}
err = gardenWrapper(targetReader, targetWriter, configReader, ioStreams, gardenArgs)
checkError(err)
shootArgs := []string{"shoot", shootName}
err = shootWrapper(targetReader, targetWriter, configReader, ioStreams, shootArgs)
checkError(err)

return nil
}

//write current namespace to target
func targetNamespace(targetWriter TargetWriter, ns string) error {
var target Target
Expand Down
2 changes: 1 addition & 1 deletion pkg/cmd/target_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ var _ = Describe("Target command", func() {
},
Entry("with missing target kind", targetCase{
args: []string{},
expectedErr: "command must be in the format: target <project|garden|seed|shoot|namespace|server> NAME",
expectedErr: "command must be in the format: target <project|garden|seed|shoot|namespace|server|dashboardUrl> NAME",
}),
Entry("with 2 garden cluster names", targetCase{
args: []string{"garden", "prod-1", "prod-2"},
Expand Down
5 changes: 3 additions & 2 deletions pkg/cmd/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,9 @@ type GardenClusters struct {

// GardenClusterMeta contains name and path to kubeconfig of gardencluster
type GardenClusterMeta struct {
Name string `yaml:"name,omitempty" json:"name,omitempty"`
KubeConfig string `yaml:"kubeConfig,omitempty" json:"kubeConfig,omitempty"`
Name string `yaml:"name,omitempty" json:"name,omitempty"`
KubeConfig string `yaml:"kubeConfig,omitempty" json:"kubeConfig,omitempty"`
DashboardURL string `yaml:"dashboardUrl,omitempty" json:"dashboardUrl,omitempty"`
}

// Issues contains all projects with issues
Expand Down

0 comments on commit 9ed975f

Please sign in to comment.