Expose full spec, by `kops get cluster -oyaml`

Also for instance groups.

Hat-tip to @zmerlynn for the suggestion.
This commit is contained in:
Justin Santa Barbara 2016-08-04 21:36:21 -04:00
parent d0fd8170cd
commit b3a4b6e08f
3 changed files with 138 additions and 53 deletions

View File

@ -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")
}

View File

@ -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)
}
}

View File

@ -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 {