make env help pretty

This commit is contained in:
天元
2020-08-07 16:38:23 +08:00
parent 772ea69fa2
commit 93240b4ae6
4 changed files with 101 additions and 33 deletions

View File

@@ -21,6 +21,29 @@ import (
"github.com/spf13/cobra"
)
func NewEnvCommand(ioStreams cmdutil.IOStreams) *cobra.Command {
ctx := context.Background()
cmd := &cobra.Command{
Use: "env",
DisableFlagsInUseLine: true,
Short: "List environments",
Long: "List all environments",
Example: `vela env [env-name]`,
RunE: func(cmd *cobra.Command, args []string) error {
return ListEnvs(ctx, args, ioStreams)
},
}
cmd.SetOut(ioStreams.Out)
cmd.SetHelpFunc(func(cmd *cobra.Command, args []string) {
cmdutil.PrintUsageIntroduce(cmd, "Prepare environments for applications")
subcmds := []*cobra.Command{cmd, NewEnvInitCommand(nil, ioStreams), NewEnvSwitchCommand(ioStreams), NewEnvDeleteCommand(ioStreams)}
cmdutil.PrintUsage(cmd, subcmds)
cmdutil.PrintExample(cmd, subcmds)
cmdutil.PrintFlags(cmd, subcmds)
})
return cmd
}
func NewEnvInitCommand(c client.Client, ioStreams cmdutil.IOStreams) *cobra.Command {
var envArgs types.EnvMeta
ctx := context.Background()
@@ -55,22 +78,6 @@ func NewEnvDeleteCommand(ioStreams cmdutil.IOStreams) *cobra.Command {
return cmd
}
func NewEnvCommand(ioStreams cmdutil.IOStreams) *cobra.Command {
ctx := context.Background()
cmd := &cobra.Command{
Use: "env",
DisableFlagsInUseLine: true,
Short: "List environments",
Long: "List all environments",
Example: `vela env [env-name]`,
RunE: func(cmd *cobra.Command, args []string) error {
return ListEnvs(ctx, args, ioStreams)
},
}
cmd.SetOut(ioStreams.Out)
return cmd
}
func NewEnvSwitchCommand(ioStreams cmdutil.IOStreams) *cobra.Command {
ctx := context.Background()
cmd := &cobra.Command{
@@ -78,7 +85,7 @@ func NewEnvSwitchCommand(ioStreams cmdutil.IOStreams) *cobra.Command {
DisableFlagsInUseLine: true,
Short: "Switch environments",
Long: "switch to another environment",
Example: `vela env test`,
Example: `vela env:sw test`,
RunE: func(cmd *cobra.Command, args []string) error {
return SwitchEnv(ctx, args, ioStreams)
},
@@ -90,15 +97,19 @@ func NewEnvSwitchCommand(ioStreams cmdutil.IOStreams) *cobra.Command {
func ListEnvs(ctx context.Context, args []string, ioStreams cmdutil.IOStreams) error {
table := uitable.New()
table.MaxColWidth = 60
table.AddRow("NAME", "NAMESPACE")
table.AddRow("NAME", "CURRENT", "NAMESPACE")
if len(args) > 0 {
envName := args[0]
env, err := getEnvByName(envName)
if err != nil {
if os.IsNotExist(err) {
ioStreams.Info(fmt.Sprintf("env %s not exist", envName))
return nil
}
return err
}
table.AddRow(envName, env.Namespace)
ioStreams.Infof(table.String())
ioStreams.Info(table.String())
return nil
}
envDir, err := system.GetEnvDir()
@@ -109,6 +120,10 @@ func ListEnvs(ctx context.Context, args []string, ioStreams cmdutil.IOStreams) e
if err != nil {
return err
}
curEnv, err := GetCurrentEnvName()
if err != nil {
curEnv = types.DefaultEnvName
}
for _, f := range files {
if f.IsDir() {
continue
@@ -121,9 +136,13 @@ func ListEnvs(ctx context.Context, args []string, ioStreams cmdutil.IOStreams) e
if err = json.Unmarshal(data, &envMeta); err != nil {
continue
}
table.AddRow(f.Name(), envMeta.Namespace)
if curEnv == f.Name() {
table.AddRow(f.Name(), "*", envMeta.Namespace)
} else {
table.AddRow(f.Name(), "", envMeta.Namespace)
}
}
ioStreams.Infof(table.String())
ioStreams.Info(table.String())
return nil
}

View File

@@ -4,6 +4,7 @@ import (
"bytes"
"context"
"os"
"strings"
"testing"
"github.com/crossplane/crossplane-runtime/pkg/test"
@@ -19,8 +20,13 @@ import (
func TestENV(t *testing.T) {
ctx := context.Background()
assert.NoError(t, os.Setenv(system.VelaHomeEnv, ".test_vela"))
home, err := system.GetVelaHomeDir()
assert.NoError(t, err)
assert.Equal(t, true, strings.HasSuffix(home, ".test_vela"))
defer os.RemoveAll(home)
// Create Default Env
err := system.InitDefaultEnv()
err = system.InitDefaultEnv()
assert.NoError(t, err)
// check and compare create default env success
@@ -55,14 +61,11 @@ func TestENV(t *testing.T) {
ioStream.Out = &b
err = ListEnvs(ctx, []string{}, ioStream)
assert.NoError(t, err)
assert.Equal(t, `NAME NAMESPACE
default default
env1 test1 `, b.String())
assert.Equal(t, "NAME \tCURRENT\tNAMESPACE\ndefault\t \tdefault \nenv1 \t* \ttest1 \n", b.String())
b.Reset()
err = ListEnvs(ctx, []string{"env1"}, ioStream)
assert.NoError(t, err)
assert.Equal(t, `NAME NAMESPACE
env1 test1 `, b.String())
assert.Equal(t, "NAME\tCURRENT\tNAMESPACE\nenv1\ttest1 \n", b.String())
ioStream.Out = os.Stdout
// can not delete current env

View File

@@ -5,6 +5,8 @@ import (
"os"
"strings"
"github.com/spf13/cobra"
"github.com/cloud-native-application/rudrx/api/types"
corev1alpha2 "github.com/crossplane/oam-kubernetes-runtime/apis/core/v1alpha2"
@@ -270,3 +272,43 @@ func GetWorkloadDefinitionByAlias(ctx context.Context, c client.Client, traitAli
return workloadDefinition, nil
}
func PrintUsageIntroduce(cmd *cobra.Command, introduce string) {
cmd.Println(introduce)
cmd.Println()
}
func PrintUsage(cmd *cobra.Command, subcmds []*cobra.Command) {
printUsage := func(cmd *cobra.Command) {
useline := cmd.UseLine()
if !strings.HasPrefix(useline, "vela ") {
useline = "vela " + useline
}
cmd.Printf(" %s\t\t%s\n", useline, cmd.Long)
}
cmd.Println("Usage:")
for _, sub := range subcmds {
printUsage(sub)
}
cmd.Println()
}
func PrintExample(cmd *cobra.Command, subcmds []*cobra.Command) {
printExample := func(cmd *cobra.Command) {
cmd.Printf(" %s\n", cmd.Example)
}
cmd.Println("Examples:")
for _, sub := range subcmds {
printExample(sub)
}
cmd.Println()
}
func PrintFlags(cmd *cobra.Command, subcmds []*cobra.Command) {
cmd.Println("Flags:")
for _, sub := range subcmds {
if sub.HasLocalFlags() {
fmt.Printf(sub.LocalFlags().FlagUsages())
}
}
cmd.Println()
}

View File

@@ -9,14 +9,18 @@ import (
"github.com/cloud-native-application/rudrx/api/types"
)
const velaHome = ".vela"
const defaultVelaHome = ".vela"
const VelaHomeEnv = "VELA_HOME"
func GetVelaHomeDir() (string, error) {
if custom := os.Getenv(VelaHomeEnv); custom != "" {
return custom, nil
}
home, err := os.UserHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, velaHome), nil
return filepath.Join(home, defaultVelaHome), nil
}
func GetApplicationDir() (string, error) {
@@ -36,19 +40,19 @@ func GetDefinitionDir() (string, error) {
}
func GetEnvDir() (string, error) {
home, err := os.UserHomeDir()
homedir, err := GetVelaHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, velaHome, "envs"), nil
return filepath.Join(homedir, "envs"), nil
}
func GetCurrentEnvPath() (string, error) {
home, err := os.UserHomeDir()
homedir, err := GetVelaHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, velaHome, "curenv"), nil
return filepath.Join(homedir, "curenv"), nil
}
func InitDefinitionDir() error {