mirror of https://github.com/kubernetes/kops.git
Expose full spec, by `kops get cluster -oyaml`
Also for instance groups. Hat-tip to @zmerlynn for the suggestion.
This commit is contained in:
parent
d0fd8170cd
commit
b3a4b6e08f
|
@ -4,14 +4,31 @@ import (
|
|||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
// getCmd represents the get command
|
||||
var getCmd = &cobra.Command{
|
||||
Use: "get",
|
||||
SuggestFor: []string{"list"},
|
||||
Short: "list or get obejcts",
|
||||
Long: `list or get obejcts`,
|
||||
// GetCmd represents the get command
|
||||
type GetCmd struct {
|
||||
output string
|
||||
|
||||
cobraCommand *cobra.Command
|
||||
}
|
||||
|
||||
func init() {
|
||||
rootCommand.AddCommand(getCmd)
|
||||
var getCmd = GetCmd{
|
||||
cobraCommand: &cobra.Command{
|
||||
Use: "get",
|
||||
SuggestFor: []string{"list"},
|
||||
Short: "list or get objects",
|
||||
Long: `list or get objects`,
|
||||
},
|
||||
}
|
||||
|
||||
const (
|
||||
OutputYaml = "yaml"
|
||||
OutputTable = "table"
|
||||
)
|
||||
|
||||
func init() {
|
||||
cmd := getCmd.cobraCommand
|
||||
|
||||
rootCommand.AddCommand(cmd)
|
||||
|
||||
cmd.PersistentFlags().StringVarP(&getCmd.output, "output", "o", OutputTable, "output format. One of: table, yaml")
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ package main
|
|||
import (
|
||||
"os"
|
||||
|
||||
"fmt"
|
||||
"github.com/golang/glog"
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/kops/upup/pkg/api"
|
||||
|
@ -21,28 +22,32 @@ func init() {
|
|||
Short: "get clusters",
|
||||
Long: `List or get clusters.`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
err := getClustersCmd.Run()
|
||||
err := getClustersCmd.Run(args)
|
||||
if err != nil {
|
||||
glog.Exitf("%v", err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
getCmd.AddCommand(cmd)
|
||||
getCmd.cobraCommand.AddCommand(cmd)
|
||||
}
|
||||
|
||||
func (c *GetClustersCmd) Run() error {
|
||||
func (c *GetClustersCmd) Run(args []string) error {
|
||||
clusterRegistry, err := rootCommand.ClusterRegistry()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
clusterNames, err := clusterRegistry.List()
|
||||
if err != nil {
|
||||
return err
|
||||
var clusters []*api.Cluster
|
||||
|
||||
clusterNames := args
|
||||
if len(args) == 0 {
|
||||
clusterNames, err = clusterRegistry.List()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
var clusters []*api.Cluster
|
||||
for _, clusterName := range clusterNames {
|
||||
cluster, err := clusterRegistry.Find(clusterName)
|
||||
if err != nil {
|
||||
|
@ -50,28 +55,56 @@ func (c *GetClustersCmd) Run() error {
|
|||
}
|
||||
|
||||
if cluster == nil {
|
||||
glog.Warningf("cluster was listed, but then not found %q", clusterName)
|
||||
return fmt.Errorf("cluster not found %q", clusterName)
|
||||
}
|
||||
|
||||
clusters = append(clusters, cluster)
|
||||
}
|
||||
|
||||
if len(clusters) == 0 {
|
||||
fmt.Fprintf(os.Stdout, "No clusters found\n")
|
||||
return nil
|
||||
}
|
||||
|
||||
t := &Table{}
|
||||
t.AddColumn("NAME", func(c *api.Cluster) string {
|
||||
return c.Name
|
||||
})
|
||||
t.AddColumn("CLOUD", func(c *api.Cluster) string {
|
||||
return c.Spec.CloudProvider
|
||||
})
|
||||
t.AddColumn("ZONES", func(c *api.Cluster) string {
|
||||
var zoneNames []string
|
||||
for _, z := range c.Spec.Zones {
|
||||
zoneNames = append(zoneNames, z.Name)
|
||||
output := getCmd.output
|
||||
if output == OutputTable {
|
||||
t := &Table{}
|
||||
t.AddColumn("NAME", func(c *api.Cluster) string {
|
||||
return c.Name
|
||||
})
|
||||
t.AddColumn("CLOUD", func(c *api.Cluster) string {
|
||||
return c.Spec.CloudProvider
|
||||
})
|
||||
t.AddColumn("ZONES", func(c *api.Cluster) string {
|
||||
var zoneNames []string
|
||||
for _, z := range c.Spec.Zones {
|
||||
zoneNames = append(zoneNames, z.Name)
|
||||
}
|
||||
return strings.Join(zoneNames, ",")
|
||||
})
|
||||
return t.Render(clusters, os.Stdout, "NAME", "CLOUD", "ZONES")
|
||||
} else if output == OutputYaml {
|
||||
var fullSpecs []*api.Cluster
|
||||
for _, cluster := range clusters {
|
||||
spec, err := clusterRegistry.ReadCompletedConfig(cluster.Name)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error reading full cluster spec for %q: %v", cluster.Name, err)
|
||||
}
|
||||
fullSpecs = append(fullSpecs, spec)
|
||||
}
|
||||
return strings.Join(zoneNames, ",")
|
||||
})
|
||||
return t.Render(clusters, os.Stdout, "NAME", "CLOUD", "ZONES")
|
||||
|
||||
for _, fullSpec := range fullSpecs {
|
||||
y, err := api.ToYaml(fullSpec)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error marshaling yaml for %q: %v", fullSpec.Name, err)
|
||||
}
|
||||
_, err = os.Stdout.Write(y)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error writing to stdout: %v", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
} else {
|
||||
return fmt.Errorf("Unknown output format: %q", output)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ package main
|
|||
import (
|
||||
"os"
|
||||
|
||||
"fmt"
|
||||
"github.com/golang/glog"
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/kops/upup/pkg/api"
|
||||
|
@ -22,17 +23,17 @@ func init() {
|
|||
Short: "get instancegroups",
|
||||
Long: `List or get InstanceGroups.`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
err := getInstanceGroupsCmd.Run()
|
||||
err := getInstanceGroupsCmd.Run(args)
|
||||
if err != nil {
|
||||
glog.Exitf("%v", err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
getCmd.AddCommand(cmd)
|
||||
getCmd.cobraCommand.AddCommand(cmd)
|
||||
}
|
||||
|
||||
func (c *GetInstanceGroupsCmd) Run() error {
|
||||
func (c *GetInstanceGroupsCmd) Run(args []string) error {
|
||||
registry, err := rootCommand.InstanceGroupRegistry()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -43,30 +44,64 @@ func (c *GetInstanceGroupsCmd) Run() error {
|
|||
return err
|
||||
}
|
||||
|
||||
if len(args) != 0 {
|
||||
m := make(map[string]*api.InstanceGroup)
|
||||
for _, ig := range instancegroups {
|
||||
m[ig.Name] = ig
|
||||
}
|
||||
instancegroups = make([]*api.InstanceGroup, 0, len(args))
|
||||
for _, arg := range args {
|
||||
ig := m[arg]
|
||||
if ig == nil {
|
||||
return fmt.Errorf("instancegroup not found %q", arg)
|
||||
}
|
||||
|
||||
instancegroups = append(instancegroups, ig)
|
||||
}
|
||||
}
|
||||
|
||||
if len(instancegroups) == 0 {
|
||||
fmt.Fprintf(os.Stdout, "No InstanceGroup objects found\n")
|
||||
return nil
|
||||
}
|
||||
|
||||
t := &Table{}
|
||||
t.AddColumn("NAME", func(c *api.InstanceGroup) string {
|
||||
return c.Name
|
||||
})
|
||||
t.AddColumn("ROLE", func(c *api.InstanceGroup) string {
|
||||
return string(c.Spec.Role)
|
||||
})
|
||||
t.AddColumn("MACHINETYPE", func(c *api.InstanceGroup) string {
|
||||
return c.Spec.MachineType
|
||||
})
|
||||
t.AddColumn("ZONES", func(c *api.InstanceGroup) string {
|
||||
return strings.Join(c.Spec.Zones, ",")
|
||||
})
|
||||
t.AddColumn("MIN", func(c *api.InstanceGroup) string {
|
||||
return intPointerToString(c.Spec.MinSize)
|
||||
})
|
||||
t.AddColumn("MAX", func(c *api.InstanceGroup) string {
|
||||
return intPointerToString(c.Spec.MinSize)
|
||||
})
|
||||
return t.Render(instancegroups, os.Stdout, "NAME", "ROLE", "MACHINETYPE", "MIN", "MAX", "ZONES")
|
||||
output := getCmd.output
|
||||
if output == OutputTable {
|
||||
t := &Table{}
|
||||
t.AddColumn("NAME", func(c *api.InstanceGroup) string {
|
||||
return c.Name
|
||||
})
|
||||
t.AddColumn("ROLE", func(c *api.InstanceGroup) string {
|
||||
return string(c.Spec.Role)
|
||||
})
|
||||
t.AddColumn("MACHINETYPE", func(c *api.InstanceGroup) string {
|
||||
return c.Spec.MachineType
|
||||
})
|
||||
t.AddColumn("ZONES", func(c *api.InstanceGroup) string {
|
||||
return strings.Join(c.Spec.Zones, ",")
|
||||
})
|
||||
t.AddColumn("MIN", func(c *api.InstanceGroup) string {
|
||||
return intPointerToString(c.Spec.MinSize)
|
||||
})
|
||||
t.AddColumn("MAX", func(c *api.InstanceGroup) string {
|
||||
return intPointerToString(c.Spec.MinSize)
|
||||
})
|
||||
return t.Render(instancegroups, os.Stdout, "NAME", "ROLE", "MACHINETYPE", "MIN", "MAX", "ZONES")
|
||||
} else if output == OutputYaml {
|
||||
for _, ig := range instancegroups {
|
||||
y, err := api.ToYaml(ig)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error marshaling yaml for %q: %v", ig.Name, err)
|
||||
}
|
||||
_, err = os.Stdout.Write(y)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error writing to stdout: %v", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
} else {
|
||||
return fmt.Errorf("Unknown output format: %q", output)
|
||||
}
|
||||
}
|
||||
|
||||
func intPointerToString(v *int) string {
|
||||
|
|
Loading…
Reference in New Issue