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

add support for target url or target -u with dashboard url #190

Merged
merged 1 commit into from
Apr 23, 2020
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
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