Merge pull request #107 from wonderflow/stage

pretty help
This commit is contained in:
Sun Jianbo
2020-08-07 23:55:40 +08:00
committed by GitHub
15 changed files with 228 additions and 61 deletions
+45 -21
View File
@@ -5,10 +5,13 @@ Vela is a command-line tool to use OAM based micro-app engine.
## Develop
Check out [DEVELOPMENT.md](./DEVELOPMENT.md) to see how to develop with RudrX
## Build `vela` binary
## Install `vela` binary
```shell script
$ go build -o /usr/local/bin/vela cmd/vela/main.go
$ chmod +x /usr/local/bin/vela
git clone git@github.com:cloud-native-application/RudrX.git
cd RudrX
make
mv bin/vela /usr/local/bin
```
## Vela commands
@@ -23,24 +26,45 @@ Usage:
vela [command]
Available Commands:
ManualScaler Attach ManualScaler trait to an app
SimpleRollout Attach SimpleRollout trait to an app
app:delete Delete OAM Applications
app:ls List applications
app:status get status of an application
completion Output shell completion code for the specified shell (bash or zsh)
containerized:run Run containerized workloads
deployment:run Run deployment workloads
env List environments
env:delete Delete environment
env:init Create environments
env:sw Switch environments
help Help about any command
init Initialize RudrX on both client and server
route Attach route trait to an app
traits List traits
version Prints out build version information
workloads List workloads
Getting Started:
env List all environments
env:delete Delete environment
env:init Create environment and switch to it
env:sw switch to another environment
version Prints out build version information
Applications:
app:delete [APPLICATION_NAME] Delete OAM Applications
app:ls List applications with workloads, traits, status and created time
app:status get status of an application, including its workload and trait
Workloads:
containerized:run <appname> [args] Run containerized workloads
deployment:run <appname> [args] Run deployment workloads
Traits:
manualscaler <appname> [args] Attach manualscaler trait to an app
manualscaler:detach <appname> Detach manualscaler trait from an app
rollout <appname> [args] Attach rollout trait to an app
rollout:detach <appname> Detach rollout trait from an app
route <appname> [args] Attach route trait to an app
route:detach <appname> Detach route trait from an app
Release:
Others:
addon:config Set the addon center, default is local (built-in ones)
addon:ls List addons of workloads and traits
System:
completion [bash|zsh] Output shell completion code for the specified shell (bash or zsh...
refresh Refresh and sync definition files from cluster
system:info show vela client and cluster version
system:init [flags] Install OAM runtime and vela builtin capabilities.
Use "vela [command] --help" for more information about a command.
```
+12
View File
@@ -126,3 +126,15 @@ func (app *Application) GetTraits(componentName string) (map[string]interface{},
type EnvMeta struct {
Namespace string `json:"namespace"`
}
const (
TagCommandType = "commandType"
TypeStart = "Getting Started"
TypeApp = "Applications"
TypeWorkloads = "Workloads"
TypeTraits = "Traits"
TypeRelease = "Release"
TypeOthers = "Others"
TypeSystem = "System"
)
+64 -12
View File
@@ -1,12 +1,18 @@
package main
import (
"flag"
"fmt"
"math/rand"
"os"
"runtime"
"strings"
"time"
"github.com/gosuri/uitable"
"k8s.io/klog"
"github.com/cloud-native-application/rudrx/api/types"
"sigs.k8s.io/controller-runtime/pkg/client/config"
@@ -90,32 +96,39 @@ func newCommand() *cobra.Command {
}
cmds.AddCommand(
cmd.NewAdminInitCommand(commandArgs, ioStream),
cmd.NewAdminInfoCommand(VelaVersion, ioStream),
cmd.NewTraitsCommand(ioStream),
cmd.NewWorkloadsCommand(ioStream),
cmd.NewRefreshCommand(commandArgs, ioStream),
cmd.NewDeleteCommand(commandArgs, ioStream, os.Args[1:]),
cmd.NewAppsCommand(commandArgs, ioStream),
cmd.NewAppStatusCommand(commandArgs, ioStream),
// Getting Start
cmd.NewEnvInitCommand(commandArgs, ioStream),
cmd.NewEnvSwitchCommand(ioStream),
cmd.NewEnvDeleteCommand(ioStream),
cmd.NewEnvCommand(ioStream),
NewVersionCommand(),
// Apps
cmd.NewAppsCommand(commandArgs, ioStream),
cmd.NewDeleteCommand(commandArgs, ioStream, os.Args[1:]),
cmd.NewAppStatusCommand(commandArgs, ioStream),
// Others
cmd.NewAddonConfigCommand(ioStream),
cmd.NewAddonListCommand(commandArgs, ioStream),
// System
cmd.NewAdminInitCommand(commandArgs, ioStream),
cmd.NewAdminInfoCommand(VelaVersion, ioStream),
cmd.NewRefreshCommand(commandArgs, ioStream),
cmd.NewCompletionCommand(),
NewVersionCommand(),
cmd.NewTraitsCommand(ioStream),
cmd.NewWorkloadsCommand(ioStream),
)
// Workloads
if err = cmd.AddWorkloadPlugins(cmds, commandArgs, ioStream); err != nil {
fmt.Println("Add plugins from workloadDefinition err", err)
os.Exit(1)
}
// Traits
if err = cmd.AddTraitPlugins(cmds, commandArgs, ioStream); err != nil {
fmt.Println("Add plugins from traitDefinition err", err)
os.Exit(1)
@@ -124,9 +137,44 @@ func newCommand() *cobra.Command {
fmt.Println("Add plugins from traitDefinition err", err)
os.Exit(1)
}
cmds.SetHelpFunc(func(cmd *cobra.Command, args []string) {
allCommands := cmd.Commands()
cmd.Printf("✈️ A Micro App Plafrom for Kubernetes.\n\nUsage:\n vela [flags]\n vela [command]\n\nAvailable Commands:\n\n")
PrintHelpByTag(cmd, allCommands, types.TypeStart)
PrintHelpByTag(cmd, allCommands, types.TypeApp)
PrintHelpByTag(cmd, allCommands, types.TypeWorkloads)
PrintHelpByTag(cmd, allCommands, types.TypeTraits)
PrintHelpByTag(cmd, allCommands, types.TypeRelease)
PrintHelpByTag(cmd, allCommands, types.TypeOthers)
PrintHelpByTag(cmd, allCommands, types.TypeSystem)
cmd.Println("Flags:")
cmd.Println(" -h, --help help for vela")
cmd.Println()
cmd.Println(`Use "vela [command] --help" for more information about a command.`)
})
// this is for mute klog
fset := flag.NewFlagSet("logs", flag.ContinueOnError)
klog.InitFlags(fset)
fset.Set("v", "-1")
return cmds
}
func PrintHelpByTag(cmd *cobra.Command, all []*cobra.Command, tag string) {
cmd.Printf(" %s:\n", tag)
table := uitable.New()
for _, c := range all {
useline := strings.TrimPrefix(c.UseLine(), "vela ")
if val, ok := c.Annotations[types.TagCommandType]; ok && val == tag {
table.AddRow(" "+useline, c.Long)
}
}
cmd.Println(table.String())
cmd.Println()
}
func runHelp(cmd *cobra.Command, args []string) {
cmd.Help()
}
@@ -135,6 +183,7 @@ func NewVersionCommand() *cobra.Command {
return &cobra.Command{
Use: "version",
Short: "Prints out build version information",
Long: "Prints out build version information",
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf(`Version: %v
GitRevision: %v
@@ -144,5 +193,8 @@ GolangVersion: %v
GitRevision,
runtime.Version())
},
Annotations: map[string]string{
types.TagCommandType: types.TypeStart,
},
}
}
+40
View File
@@ -0,0 +1,40 @@
package builtin
var Deployment = `apiVersion: core.oam.dev/v1alpha2
kind: WorkloadDefinition
metadata:
name: deployments.apps
annotations:
oam.appengine.info/apiVersion: "apps/v1"
oam.appengine.info/kind: "Deployment"
spec:
definitionRef:
name: deployments.apps
extension:
template: |
#Template: {
apiVersion: "apps/v1"
kind: "Deployment"
metadata: name: deployment.name
spec: {
containers: [{
image: deployment.image
name: deployment.name
env: deployment.env
ports: [{
containerPort: deployment.port
protocol: "TCP"
name: "default"
}]
}]
}
}
deployment: {
name: string
image: string
port: *8080 | int
env: [...{
name: string
value: string
}]
}`
+6
View File
@@ -78,6 +78,9 @@ func NewAddonConfigCommand(ioStreams cmdutil.IOStreams) *cobra.Command {
ioStreams.Errorf("Unnecessary arguments are specified, please try again")
}
},
Annotations: map[string]string{
types.TagCommandType: types.TypeOthers,
},
}
return cmd
}
@@ -104,6 +107,9 @@ func NewAddonListCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Comma
}
return nil
},
Annotations: map[string]string{
types.TagCommandType: types.TypeOthers,
},
}
return cmd
}
+14 -19
View File
@@ -7,6 +7,8 @@ import (
"log"
"os"
"github.com/cloud-native-application/rudrx/pkg/builtin"
"helm.sh/helm/v3/pkg/release"
"github.com/cloud-native-application/rudrx/api/types"
@@ -38,14 +40,6 @@ var (
settings = cli.New()
)
const initDesc = `
This command installs oam-kubernetes-runtime onto your Kubernetes Cluster.
As with the rest of the Vela commands, 'vela init' discovers Kubernetes clusters
by reading $KUBECONFIG (default '~/.kube/config') and using the default context.
When installing oam-kubernetes-runtime, 'vela init' will attempt to install the latest released
version.
`
type initCmd struct {
namespace string
out io.Writer
@@ -70,13 +64,7 @@ var (
}
workloadResource = map[string]string{
"statefulset": "statefulsets.apps",
"daemonset": "daemonsets.apps",
"deployment": "deployments.apps",
"job": "jobs.batch",
"secret": "secrets",
"service": "services",
"configmap": "configmaps",
"deployment": builtin.Deployment,
}
)
@@ -84,11 +72,15 @@ func NewAdminInfoCommand(version string, ioStreams cmdutil.IOStreams) *cobra.Com
i := &infoCmd{out: ioStreams.Out}
cmd := &cobra.Command{
Use: "admin:info",
Use: "system:info",
Short: "show vela client and cluster version",
Long: "show vela client and cluster version",
RunE: func(cmd *cobra.Command, args []string) error {
return i.run(version, ioStreams)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeSystem,
},
}
return cmd
}
@@ -111,9 +103,9 @@ func NewAdminInitCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Comma
i := &initCmd{out: ioStreams.Out}
cmd := &cobra.Command{
Use: "admin:init",
Short: "Initialize Vela on both client and server",
Long: initDesc,
Use: "system:init",
Short: "Initialize vela on both client and server",
Long: "Install OAM runtime and vela builtin capabilities.",
RunE: func(cmd *cobra.Command, args []string) error {
newClient, err := client.New(c.Config, client.Options{Scheme: c.Schema})
if err != nil {
@@ -123,6 +115,9 @@ func NewAdminInitCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Comma
i.namespace = types.DefaultOAMNS
return i.run(ioStreams)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeSystem,
},
}
flag := cmd.Flags()
+9 -7
View File
@@ -2,20 +2,20 @@ package cmd
import (
"fmt"
"github.com/spf13/cobra"
"io"
"os"
"path/filepath"
"github.com/cloud-native-application/rudrx/api/types"
"github.com/spf13/cobra"
)
const completionDesc = `
Output shell completion code for the specified shell (bash or zsh).
const completionDesc = `Output shell completion code for the specified shell (bash or zsh).
The shell code must be evaluated to provide interactive completion
of vela commands.
`
const bashCompDesc = `
Generate the autocompletion script for Vela for the bash shell.
const bashCompDesc = `Generate the autocompletion script for Vela for the bash shell.
To load completions in your current shell session:
$ source <(vela completion bash)
@@ -27,8 +27,7 @@ MacOS:
$ vela completion bash > /usr/local/etc/bash_completion.d/vela
`
const zshCompDesc = `
Generate the autocompletion script for Vela for the zsh shell.
const zshCompDesc = `Generate the autocompletion script for Vela for the zsh shell.
To load completions in your current shell session:
$ source <(vela completion zsh)
@@ -43,6 +42,9 @@ func NewCompletionCommand() *cobra.Command {
Short: "Output shell completion code for the specified shell (bash or zsh)",
Long: completionDesc,
Args: cobra.NoArgs,
Annotations: map[string]string{
types.TagCommandType: types.TypeSystem,
},
}
bash := &cobra.Command{
+3
View File
@@ -31,6 +31,9 @@ func newDeleteCommand() *cobra.Command {
DisableFlagsInUseLine: true,
Short: "Delete OAM Applications",
Long: "Delete OAM Applications",
Annotations: map[string]string{
types.TagCommandType: types.TypeApp,
},
Example: `
vela delete frontend
`}
+12
View File
@@ -32,6 +32,9 @@ func NewEnvCommand(ioStreams cmdutil.IOStreams) *cobra.Command {
RunE: func(cmd *cobra.Command, args []string) error {
return ListEnvs(ctx, args, ioStreams)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeStart,
},
}
cmd.SetOut(ioStreams.Out)
cmd.SetHelpFunc(func(cmd *cobra.Command, args []string) {
@@ -60,6 +63,9 @@ func NewEnvInitCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Command
}
return CreateOrUpdateEnv(ctx, newClient, &envArgs, args, ioStreams)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeStart,
},
}
cmd.SetOut(ioStreams.Out)
cmd.Flags().StringVar(&envArgs.Namespace, "namespace", "default", "specify K8s namespace for env")
@@ -77,6 +83,9 @@ func NewEnvDeleteCommand(ioStreams cmdutil.IOStreams) *cobra.Command {
RunE: func(cmd *cobra.Command, args []string) error {
return DeleteEnv(ctx, args, ioStreams)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeStart,
},
}
cmd.SetOut(ioStreams.Out)
return cmd
@@ -93,6 +102,9 @@ func NewEnvSwitchCommand(ioStreams cmdutil.IOStreams) *cobra.Command {
RunE: func(cmd *cobra.Command, args []string) error {
return SwitchEnv(ctx, args, ioStreams)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeStart,
},
}
cmd.SetOut(ioStreams.Out)
return cmd
+3
View File
@@ -32,6 +32,9 @@ func NewAppsCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Command {
printApplicationList(ctx, newClient, "", env.Namespace)
return nil
},
Annotations: map[string]string{
types.TagCommandType: types.TypeApp,
},
}
cmd.PersistentFlags().StringP("app", "a", "", "Application name")
+3
View File
@@ -28,6 +28,9 @@ func NewRefreshCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Command
}
return RefreshDefinitions(ctx, newClient, ioStreams)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeSystem,
},
}
cmd.SetOut(ioStreams.Out)
return cmd
+3
View File
@@ -39,6 +39,9 @@ func NewAppStatusCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Comma
}
return printApplicationStatus(ctx, newClient, ioStreams, appName, namespace)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeApp,
},
}
cmd.SetOut(ioStreams.Out)
return cmd
+6
View File
@@ -72,6 +72,9 @@ func AddTraitPlugins(parentCmd *cobra.Command, c types.Args, ioStreams cmdutil.I
}
return o.Run(cmd, ctx)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeTraits,
},
}
pluginCmd.SetOut(o.Out)
for _, v := range tmp.Parameters {
@@ -196,6 +199,9 @@ func DetachTraitPlugins(parentCmd *cobra.Command, c types.Args, ioStreams cmduti
}
return o.Run(cmd, ctx)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeTraits,
},
}
pluginCmd.SetOut(o.Out)
o.TraitAlias = name
+3
View File
@@ -75,6 +75,9 @@ func AddWorkloadPlugins(parentCmd *cobra.Command, c types.Args, ioStreams cmduti
}
return o.Run(cmd)
},
Annotations: map[string]string{
types.TagCommandType: types.TypeWorkloads,
},
}
pluginCmd.SetOut(o.Out)
for _, v := range tmp.Parameters {
+5 -2
View File
@@ -18,6 +18,7 @@ package logs
import (
"flag"
"io/ioutil"
"log"
"time"
@@ -41,8 +42,10 @@ func (writer KlogWriter) Write(data []byte) (n int, err error) {
// InitLogs initializes logs the way we want for kubernetes.
func InitLogs() {
log.SetOutput(KlogWriter{})
log.SetFlags(0)
log.SetOutput(ioutil.Discard)
klog.SetOutput(ioutil.Discard)
log.SetFlags(-1)
// The default glog flush interval is one second.
go wait.Until(klog.Flush, time.Second, wait.NeverStop)
}