Merge pull request #2129 from Fish-pro/fix-karmadactl-example
karmadactl-example:print example by templates like kubectl
This commit is contained in:
commit
6969a5d643
|
@ -6,6 +6,7 @@ import (
|
|||
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
"github.com/karmada-io/karmada/pkg/karmadactl/cmdinit/kubernetes"
|
||||
"github.com/karmada-io/karmada/pkg/version"
|
||||
|
@ -16,6 +17,43 @@ const (
|
|||
initLong = `Install karmada in kubernetes.`
|
||||
)
|
||||
|
||||
var (
|
||||
initExamples = templates.Examples(`
|
||||
# Install Karmada in Kubernetes cluster
|
||||
# The karmada-apiserver binds the master node's IP by default
|
||||
%[1]s init
|
||||
|
||||
# China mainland registry mirror can be specified by using kube-image-mirror-country
|
||||
%[1]s init --kube-image-mirror-country=cn
|
||||
|
||||
# Kube registry can be specified by using kube-image-registry
|
||||
%[1]s init --kube-image-registry=registry.cn-hangzhou.aliyuncs.com/google_containers
|
||||
|
||||
# Specify the URL to download CRD tarball
|
||||
%[1]s init --crds https://github.com/karmada-io/karmada/releases/download/%[2]s/crds.tar.gz
|
||||
|
||||
# Specify the local CRD tarball
|
||||
%[1]s init --crds /root/crds.tar.gz
|
||||
|
||||
# Use PVC to persistent storage etcd data
|
||||
%[1]s init --etcd-storage-mode PVC --storage-classes-name {StorageClassesName}
|
||||
|
||||
# Use hostPath to persistent storage etcd data. For data security, only 1 etcd pod can run in hostPath mode
|
||||
%[1]s init --etcd-storage-mode hostPath --etcd-replicas 1
|
||||
|
||||
# Use hostPath to persistent storage etcd data but select nodes by labels
|
||||
%[1]s init --etcd-storage-mode hostPath --etcd-node-selector-labels karmada.io/etcd=true
|
||||
|
||||
# Private registry can be specified for all images
|
||||
%[1]s init --etcd-image local.registry.com/library/etcd:3.5.3-0
|
||||
|
||||
# Deploy highly available(HA) karmada
|
||||
%[1]s init --karmada-apiserver-replicas 3 --etcd-replicas 3 --etcd-storage-mode PVC --storage-classes-name {StorageClassesName}
|
||||
|
||||
# Specify external IPs(load balancer or HA IP) which used to sign the certificate
|
||||
%[1]s init --cert-external-ip 10.235.1.2 --cert-external-dns www.karmada.io`)
|
||||
)
|
||||
|
||||
// NewCmdInit install karmada on kubernetes
|
||||
func NewCmdInit(parentCommand string) *cobra.Command {
|
||||
opts := kubernetes.CommandInitOption{}
|
||||
|
@ -92,39 +130,5 @@ func initExample(parentCommand string) string {
|
|||
klog.Infof("No default release version found. build version: %s", version.Get().String())
|
||||
releaseVer = &version.ReleaseVersion{}
|
||||
}
|
||||
example := `
|
||||
# Install Karmada in Kubernetes cluster
|
||||
# The karmada-apiserver binds the master node's IP by default` + "\n" +
|
||||
fmt.Sprintf("%s init", parentCommand) + `
|
||||
|
||||
# China mainland registry mirror can be specified by using kube-image-mirror-country` + "\n" +
|
||||
fmt.Sprintf("%s init --kube-image-mirror-country=cn", parentCommand) + `
|
||||
|
||||
# Kube registry can be specified by using kube-image-registry` + "\n" +
|
||||
fmt.Sprintf("%s init --kube-image-registry=registry.cn-hangzhou.aliyuncs.com/google_containers", parentCommand) + `
|
||||
|
||||
# Specify the URL to download CRD tarball` + "\n" +
|
||||
fmt.Sprintf("%s init --crds https://github.com/karmada-io/karmada/releases/download/%s/crds.tar.gz", parentCommand, releaseVer.FirstMinorRelease()) + `
|
||||
|
||||
# Specify the local CRD tarball` + "\n" +
|
||||
fmt.Sprintf("%s init --crds /root/crds.tar.gz", parentCommand) + `
|
||||
|
||||
# Use PVC to persistent storage etcd data` + "\n" +
|
||||
fmt.Sprintf("%s init --etcd-storage-mode PVC --storage-classes-name {StorageClassesName}", parentCommand) + `
|
||||
|
||||
# Use hostPath to persistent storage etcd data. For data security, only 1 etcd pod can run in hostPath mode` + "\n" +
|
||||
fmt.Sprintf("%s init --etcd-storage-mode hostPath --etcd-replicas 1", parentCommand) + `
|
||||
|
||||
# Use hostPath to persistent storage etcd data but select nodes by labels` + "\n" +
|
||||
fmt.Sprintf("%s init --etcd-storage-mode hostPath --etcd-node-selector-labels karmada.io/etcd=true", parentCommand) + `
|
||||
|
||||
# Private registry can be specified for all images` + "\n" +
|
||||
fmt.Sprintf("%s init --etcd-image local.registry.com/library/etcd:3.5.3-0", parentCommand) + `
|
||||
|
||||
# Deploy highly available(HA) karmada` + "\n" +
|
||||
fmt.Sprintf("%s init --karmada-apiserver-replicas 3 --etcd-replicas 3 --etcd-storage-mode PVC --storage-classes-name {StorageClassesName}", parentCommand) + `
|
||||
|
||||
# Specify external IPs(load balancer or HA IP) which used to sign the certificate` + "\n" +
|
||||
fmt.Sprintf("%s init --cert-external-ip 10.235.1.2 --cert-external-dns www.karmada.io", parentCommand)
|
||||
return example
|
||||
return fmt.Sprintf(initExamples, parentCommand, releaseVer.FirstMinorRelease())
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import (
|
|||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/apimachinery/pkg/util/strategicpatch"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
|
||||
karmadaclientset "github.com/karmada-io/karmada/pkg/generated/clientset/versioned"
|
||||
|
@ -23,6 +24,13 @@ var (
|
|||
|
||||
uncordonShort = `Mark cluster as schedulable`
|
||||
uncordonLong = `Mark cluster as schedulable.`
|
||||
|
||||
cordonExample = templates.Examples(`
|
||||
# Mark cluster "foo" as unschedulable.
|
||||
%[1]s cordon foo`)
|
||||
uncordonExample = templates.Examples(`
|
||||
# Mark cluster "foo" as schedulable.
|
||||
%[1]s uncordon foo`)
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -40,7 +48,7 @@ func NewCmdCordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comm
|
|||
Use: "cordon CLUSTER",
|
||||
Short: cordonShort,
|
||||
Long: cordonLong,
|
||||
Example: cordonExample(parentCommand),
|
||||
Example: fmt.Sprintf(cordonExample, parentCommand),
|
||||
SilenceUsage: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := opts.Complete(args); err != nil {
|
||||
|
@ -61,13 +69,6 @@ func NewCmdCordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comm
|
|||
return cmd
|
||||
}
|
||||
|
||||
func cordonExample(parentCommand string) string {
|
||||
example := `
|
||||
# Mark cluster "foo" as unschedulable` + "\n" +
|
||||
fmt.Sprintf("%s cordon foo", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// NewCmdUncordon defines the `uncordon` command that mark cluster as schedulable.
|
||||
func NewCmdUncordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Command {
|
||||
opts := CommandCordonOption{}
|
||||
|
@ -75,7 +76,7 @@ func NewCmdUncordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Co
|
|||
Use: "uncordon CLUSTER",
|
||||
Short: uncordonShort,
|
||||
Long: uncordonLong,
|
||||
Example: uncordonExample(parentCommand),
|
||||
Example: fmt.Sprintf(uncordonExample, parentCommand),
|
||||
SilenceUsage: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := opts.Complete(args); err != nil {
|
||||
|
@ -94,13 +95,6 @@ func NewCmdUncordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Co
|
|||
return cmd
|
||||
}
|
||||
|
||||
func uncordonExample(parentCommand string) string {
|
||||
example := `
|
||||
# Mark cluster "foo" as schedulable.` + "\n" +
|
||||
fmt.Sprintf("%s uncordon foo", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// CommandCordonOption holds all command options for cordon and uncordon
|
||||
type CommandCordonOption struct {
|
||||
// global flags
|
||||
|
|
|
@ -10,6 +10,7 @@ import (
|
|||
corev1 "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
"github.com/karmada-io/karmada/pkg/karmadactl/cmdinit/utils"
|
||||
)
|
||||
|
@ -19,6 +20,12 @@ const (
|
|||
karmadaNodeLabel = "karmada.io/etcd"
|
||||
)
|
||||
|
||||
var (
|
||||
deInitExample = templates.Examples(`
|
||||
# Remove Karmada from the Kubernetes cluster.
|
||||
%[1]s deinit`)
|
||||
)
|
||||
|
||||
// CommandDeInitOption options for deinit.
|
||||
type CommandDeInitOption struct {
|
||||
// KubeConfig holds host cluster KUBECONFIG file path.
|
||||
|
@ -40,7 +47,7 @@ func NewCmdDeInit(parentCommand string) *cobra.Command {
|
|||
Use: "deinit",
|
||||
Short: "Removes Karmada from Kubernetes",
|
||||
Long: "Removes Karmada from Kubernetes",
|
||||
Example: deInitExample(parentCommand),
|
||||
Example: fmt.Sprintf(deInitExample, parentCommand),
|
||||
SilenceUsage: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := opts.Complete(); err != nil {
|
||||
|
@ -62,13 +69,6 @@ func NewCmdDeInit(parentCommand string) *cobra.Command {
|
|||
return cmd
|
||||
}
|
||||
|
||||
func deInitExample(parentCommand string) string {
|
||||
example := `
|
||||
# Remove Karmada from the Kubernetes cluster` + "\n" +
|
||||
fmt.Sprintf("%s deinit", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// Complete the conditions required to be able to run deinit.
|
||||
func (o *CommandDeInitOption) Complete() error {
|
||||
if o.KubeConfig == "" {
|
||||
|
|
|
@ -13,10 +13,30 @@ import (
|
|||
"k8s.io/cli-runtime/pkg/resource"
|
||||
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
||||
"k8s.io/kubectl/pkg/describe"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
"github.com/karmada-io/karmada/pkg/karmadactl/options"
|
||||
)
|
||||
|
||||
var (
|
||||
describeExample = templates.Examples(`
|
||||
# Describe a pod in cluster(member1)
|
||||
%[1]s describe pods/nginx -C=member1
|
||||
|
||||
# Describe all pods in cluster(member1)
|
||||
%[1]s describe pods -C=member1
|
||||
|
||||
# Describe a pod identified by type and name in "pod.json" in cluster(member1)
|
||||
%[1]s describe -f pod.json -C=member1
|
||||
|
||||
# Describe pods by label name=myLabel in cluster(member1)
|
||||
%[1]s describe po -l name=myLabel -C=member1
|
||||
|
||||
# Describe all pods managed by the 'frontend' replication controller in cluster(member1)
|
||||
# (rc-created pods get the name of the rc as a prefix in the pod name)
|
||||
%[1]s describe pods frontend -C=member1`)
|
||||
)
|
||||
|
||||
// NewCmdDescribe new describe command.
|
||||
func NewCmdDescribe(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Command {
|
||||
ioStreams := genericclioptions.IOStreams{In: getIn, Out: getOut, ErrOut: getErr}
|
||||
|
@ -36,7 +56,7 @@ func NewCmdDescribe(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Co
|
|||
Use: "describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME) (-C CLUSTER)",
|
||||
Short: "Show details of a specific resource or group of resources in a cluster",
|
||||
SilenceUsage: true,
|
||||
Example: describeExample(parentCommand),
|
||||
Example: fmt.Sprintf(describeExample, parentCommand),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := o.Complete(karmadaConfig, args); err != nil {
|
||||
return err
|
||||
|
@ -86,26 +106,6 @@ type CommandDescribeOptions struct {
|
|||
genericclioptions.IOStreams
|
||||
}
|
||||
|
||||
func describeExample(parentCommand string) string {
|
||||
example := `
|
||||
# Describe a pod in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s describe pods/nginx -C=member1", parentCommand) + `
|
||||
|
||||
# Describe all pods in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s describe pods -C=member1", parentCommand) + `
|
||||
|
||||
# # Describe a pod identified by type and name in "pod.json" in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s describe -f pod.json -C=member1", parentCommand) + `
|
||||
|
||||
# Describe pods by label name=myLabel in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s describe po -l name=myLabel -C=member1", parentCommand) + `
|
||||
|
||||
# Describe all pods managed by the 'frontend' replication controller in cluster(member1)
|
||||
# (rc-created pods get the name of the rc as a prefix in the pod name)` + "\n" +
|
||||
fmt.Sprintf("%s describe pods frontend -C=member1", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// Complete ensures that options are valid and marshals them if necessary
|
||||
func (o *CommandDescribeOptions) Complete(karmadaConfig KarmadaConfig, args []string) error {
|
||||
var err error
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
"k8s.io/cli-runtime/pkg/genericclioptions"
|
||||
kubectlexec "k8s.io/kubectl/pkg/cmd/exec"
|
||||
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
"github.com/karmada-io/karmada/pkg/karmadactl/options"
|
||||
)
|
||||
|
@ -16,6 +17,28 @@ const (
|
|||
defaultPodExecTimeout = 60 * time.Second
|
||||
)
|
||||
|
||||
var (
|
||||
execExample = templates.Examples(`
|
||||
# Get output from running the 'date' command from pod mypod, using the first container by default in cluster(member1)
|
||||
%[1]s exec mypod -C=member1 -- date
|
||||
|
||||
# Get output from running the 'date' command in ruby-container from pod mypod in cluster(member1)
|
||||
%[1]s exec mypod -c ruby-container -C=member1 -- date
|
||||
|
||||
# Get output from running the 'date' command in ruby-container from pod mypod in cluster(member1)
|
||||
%[1]sexec mypod -c ruby-container -C=member1 -- date
|
||||
|
||||
# Switch to raw terminal mode; sends stdin to 'bash' in ruby-container from pod mypod in cluster(member1)
|
||||
# and sends stdout/stderr from 'bash' back to the client
|
||||
%[1]s exec mypod -c ruby-container -C=member1 -i -t -- bash -il
|
||||
|
||||
# Get output from running 'date' command from the first pod of the deployment mydeployment, using the first container by default in cluster(member1)
|
||||
%[1]s exec deploy/mydeployment -C=member1 -- date
|
||||
|
||||
# Get output from running 'date' command from the first pod of the service myservice, using the first container by default in cluster(member1)
|
||||
%[1]s exec svc/myservice -C=member1 -- date`)
|
||||
)
|
||||
|
||||
// NewCmdExec new exec command.
|
||||
func NewCmdExec(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Command {
|
||||
streams := genericclioptions.IOStreams{In: getIn, Out: getOut, ErrOut: getErr}
|
||||
|
@ -32,7 +55,7 @@ func NewCmdExec(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comman
|
|||
Use: "exec (POD | TYPE/NAME) [-c CONTAINER] [flags] (-C CLUSTER) -- COMMAND [args...]",
|
||||
Short: "Execute a command in a container in a cluster",
|
||||
Long: "Execute a command in a container in a cluster",
|
||||
Example: execExample(parentCommand),
|
||||
Example: fmt.Sprintf(execExample, parentCommand),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
argsLenAtDash := cmd.ArgsLenAtDash()
|
||||
if err := o.Complete(karmadaConfig, cmd, args, argsLenAtDash); err != nil {
|
||||
|
@ -62,29 +85,6 @@ func NewCmdExec(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comman
|
|||
return cmd
|
||||
}
|
||||
|
||||
func execExample(parentCommand string) string {
|
||||
example := `
|
||||
# Get output from running the 'date' command from pod mypod, using the first container by default in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s exec mypod -C=member1 -- date", parentCommand) + `
|
||||
|
||||
# Get output from running the 'date' command from pod mypod in namespace(foo), using the first container by default in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s exec mypod -C=member1 --namespace foo -- date", parentCommand) + `
|
||||
|
||||
# Get output from running the 'date' command in ruby-container from pod mypod in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s exec mypod -c ruby-container -C=member1 -- date", parentCommand) + `
|
||||
|
||||
# Switch to raw terminal mode; sends stdin to 'bash' in ruby-container from pod mypod in cluster(member1)
|
||||
# and sends stdout/stderr from 'bash' back to the client` + "\n" +
|
||||
fmt.Sprintf("%s exec mypod -c ruby-container -C=member1 -i -t -- bash -il", parentCommand) + `
|
||||
|
||||
# Get output from running 'date' command from the first pod of the deployment mydeployment, using the first container by default in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s exec deploy/mydeployment -C=member1 -- date", parentCommand) + `
|
||||
|
||||
# Get output from running 'date' command from the first pod of the service myservice, using the first container by default in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s exec svc/myservice -C=member1 -- date", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// ExecOptions declare the arguments accepted by the Exec command
|
||||
type ExecOptions struct {
|
||||
// global flags
|
||||
|
|
|
@ -30,6 +30,7 @@ import (
|
|||
"k8s.io/kubectl/pkg/cmd/get"
|
||||
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
||||
"k8s.io/kubectl/pkg/util/interrupt"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
utilpointer "k8s.io/utils/pointer"
|
||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
|
||||
|
@ -59,6 +60,31 @@ var (
|
|||
eventColumn = metav1.TableColumnDefinition{Name: "EVENT", Type: "string", Format: "", Priority: 0}
|
||||
|
||||
getShort = `Display one or many resources`
|
||||
|
||||
getExample = templates.Examples(`
|
||||
# List all pods in ps output format
|
||||
%[1]s get pods
|
||||
|
||||
# List all pods in ps output format with more information (such as node name)
|
||||
%[1]s get pods -o wide
|
||||
|
||||
# List all pods of member1 cluster in ps output format
|
||||
%[1]s get pods -C member1
|
||||
|
||||
# List a single replicasets controller with specified NAME in ps output format
|
||||
%[1]s get replicasets nginx
|
||||
|
||||
# List deployments in JSON output format, in the "v1" version of the "apps" API group
|
||||
%[1]s get deployments.v1.apps -o json
|
||||
|
||||
# Return only the phase value of the specified resource
|
||||
%[1]s get -o template deployment/nginx -C member1 --template={{.spec.replicas}}
|
||||
|
||||
# List all replication controllers and services together in ps output format
|
||||
%[1]s get rs,services
|
||||
|
||||
# List one or more resources by their type and names
|
||||
%[1]s get rs/nginx-cb87b6d88 service/kubernetes`)
|
||||
)
|
||||
|
||||
// NewCmdGet New get command
|
||||
|
@ -69,7 +95,7 @@ func NewCmdGet(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Command
|
|||
Use: "get [NAME | -l label | -n namespace] [flags]",
|
||||
Short: getShort,
|
||||
SilenceUsage: true,
|
||||
Example: getExample(parentCommand),
|
||||
Example: fmt.Sprintf(getExample, parentCommand),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := o.Complete(karmadaConfig); err != nil {
|
||||
return err
|
||||
|
@ -1038,34 +1064,6 @@ func Exists(path string) bool {
|
|||
return true
|
||||
}
|
||||
|
||||
func getExample(parentCommand string) string {
|
||||
example := `
|
||||
# List all pods in ps output format` + "\n" +
|
||||
fmt.Sprintf("%s get pods", parentCommand) + `
|
||||
|
||||
# List all pods in ps output format with more information (such as node name)` + "\n" +
|
||||
fmt.Sprintf("%s get pods -o wide", parentCommand) + `
|
||||
|
||||
# List all pods of member1 cluster in ps output format` + "\n" +
|
||||
fmt.Sprintf("%s get pods -C member1", parentCommand) + `
|
||||
|
||||
# List a single replicasets controller with specified NAME in ps output format ` + "\n" +
|
||||
fmt.Sprintf("%s get replicasets nginx", parentCommand) + `
|
||||
|
||||
# List deployments in JSON output format, in the "v1" version of the "apps" API group ` + "\n" +
|
||||
fmt.Sprintf("%s get deployments.v1.apps -o json", parentCommand) + `
|
||||
|
||||
# Return only the phase value of the specified resource ` + "\n" +
|
||||
fmt.Sprintf("%s get -o template deployment/nginx -C member1 --template={{.spec.replicas}}", parentCommand) + `
|
||||
|
||||
# List all replication controllers and services together in ps output format ` + "\n" +
|
||||
fmt.Sprintf("%s get rs,services", parentCommand) + `
|
||||
|
||||
# List one or more resources by their type and names ` + "\n" +
|
||||
fmt.Sprintf("%s get rs/nginx-cb87b6d88 service/kubernetes", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// skipPrinter allows conditionally suppressing object output via the output field.
|
||||
// table objects are suppressed by setting their Rows to nil (allowing column definitions to propagate to the delegate).
|
||||
// non-table objects are suppressed by not calling the delegate at all.
|
||||
|
|
|
@ -10,6 +10,7 @@ import (
|
|||
kubeclient "k8s.io/client-go/kubernetes"
|
||||
"k8s.io/client-go/rest"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
|
||||
"github.com/karmada-io/karmada/pkg/apis/cluster/validation"
|
||||
|
@ -21,6 +22,10 @@ import (
|
|||
var (
|
||||
joinShort = `Register a cluster to control plane`
|
||||
joinLong = `Join registers a cluster to control plane.`
|
||||
|
||||
joinExample = templates.Examples(`
|
||||
# Join cluster into karamada control plane, if '--cluster-context' not specified, take the cluster name as the context
|
||||
%[1]s join CLUSTER_NAME --cluster-kubeconfig=<KUBECONFIG>`)
|
||||
)
|
||||
|
||||
// NewCmdJoin defines the `join` command that registers a cluster.
|
||||
|
@ -31,7 +36,7 @@ func NewCmdJoin(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comman
|
|||
Use: "join CLUSTER_NAME --cluster-kubeconfig=<KUBECONFIG>",
|
||||
Short: joinShort,
|
||||
Long: joinLong,
|
||||
Example: joinExample(parentCommand),
|
||||
Example: fmt.Sprintf(joinExample, parentCommand),
|
||||
SilenceUsage: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := opts.Complete(args); err != nil {
|
||||
|
@ -53,13 +58,6 @@ func NewCmdJoin(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comman
|
|||
return cmd
|
||||
}
|
||||
|
||||
func joinExample(parentCommand string) string {
|
||||
example := `
|
||||
# Join cluster into karamada control plane, if '--cluster-context' not specified, take the cluster name as the context` + "\n" +
|
||||
fmt.Sprintf("%s join CLUSTER_NAME --cluster-kubeconfig=<KUBECONFIG>", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// CommandJoinOption holds all command options.
|
||||
type CommandJoinOption struct {
|
||||
options.GlobalCommandOptions
|
||||
|
|
|
@ -11,6 +11,7 @@ import (
|
|||
"k8s.io/client-go/rest"
|
||||
kubectllogs "k8s.io/kubectl/pkg/cmd/logs"
|
||||
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
karmadaclientset "github.com/karmada-io/karmada/pkg/generated/clientset/versioned"
|
||||
"github.com/karmada-io/karmada/pkg/karmadactl/options"
|
||||
|
@ -22,6 +23,30 @@ const (
|
|||
|
||||
var (
|
||||
logsUsageErrStr = fmt.Sprintf("expected '%s'.\nPOD or TYPE/NAME is a required argument for the logs command", logsUsageStr)
|
||||
logsExample = templates.Examples(`
|
||||
# Return snapshot logs from pod nginx with only one container in cluster(member1)
|
||||
%[1]s logs nginx -C=member1
|
||||
|
||||
# Return snapshot logs from pod nginx with multi containers in cluster(member1)
|
||||
%[1]s logs nginx --all-containers=true -C=member1
|
||||
|
||||
# Return snapshot logs from all containers in pods defined by label app=nginx in cluster(member1)
|
||||
%[1]s logs -l app=nginx --all-containers=true -C=member1
|
||||
|
||||
# Return snapshot of previous terminated ruby container logs from pod web-1 in cluster(member1)
|
||||
%[1]s logs -p -c ruby web-1 -C=member1
|
||||
|
||||
# Begin streaming the logs of the ruby container in pod web-1 in cluster(member1)
|
||||
%[1]s logs -f -c ruby web-1 -C=member1
|
||||
|
||||
# Begin streaming the logs from all containers in pods defined by label app=nginx in cluster(member1)
|
||||
%[1]s logs -f -l app=nginx --all-containers=true -C=member1
|
||||
|
||||
# Display only the most recent 20 lines of output in pod nginx in cluster(member1)
|
||||
%[1]s logs --tail=20 nginx -C=member1
|
||||
|
||||
# Show all logs from pod nginx written in the last hour in cluster(member1)
|
||||
%[1]s logs --since=1h nginx -C=member1`)
|
||||
)
|
||||
|
||||
// NewCmdLogs new logs command.
|
||||
|
@ -35,7 +60,7 @@ func NewCmdLogs(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comman
|
|||
Use: logsUsageStr,
|
||||
Short: "Print the logs for a container in a pod in a cluster",
|
||||
SilenceUsage: true,
|
||||
Example: logsExample(parentCommand),
|
||||
Example: fmt.Sprintf(logsExample, parentCommand),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := o.Complete(karmadaConfig, cmd, args); err != nil {
|
||||
return err
|
||||
|
@ -57,34 +82,6 @@ func NewCmdLogs(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comman
|
|||
return cmd
|
||||
}
|
||||
|
||||
func logsExample(parentCommand string) string {
|
||||
example := `
|
||||
# Return snapshot logs from pod nginx with only one container in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s logs nginx -C=member1", parentCommand) + `
|
||||
|
||||
# Return snapshot logs from pod nginx with multi containers in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s logs nginx --all-containers=true -C=member1", parentCommand) + `
|
||||
|
||||
# Return snapshot logs from all containers in pods defined by label app=nginx in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s logs -l app=nginx --all-containers=true -C=member1", parentCommand) + `
|
||||
|
||||
# Return snapshot of previous terminated ruby container logs from pod web-1 in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s logs -p -c ruby web-1 -C=member1", parentCommand) + `
|
||||
|
||||
# Begin streaming the logs of the ruby container in pod web-1 in cluster(member1)` + "\n" +
|
||||
fmt.Sprintf("%s logs -f -c ruby web-1 -C=member1", parentCommand) + `
|
||||
|
||||
# Begin streaming the logs from all containers in pods defined by label app=nginx in cluster(member1) ` + "\n" +
|
||||
fmt.Sprintf("%s logs -f -l app=nginx --all-containers=true -C=member1", parentCommand) + `
|
||||
|
||||
# Display only the most recent 20 lines of output in pod nginx in cluster(member1) ` + "\n" +
|
||||
fmt.Sprintf("%s logs --tail=20 nginx -C=member1", parentCommand) + `
|
||||
|
||||
# Show all logs from pod nginx written in the last hour in cluster(member1) ` + "\n" +
|
||||
fmt.Sprintf("%s logs --since=1h nginx -C=member1", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// LogsOptions contains the input to the logs command.
|
||||
type LogsOptions struct {
|
||||
// global flags
|
||||
|
|
|
@ -18,6 +18,7 @@ import (
|
|||
"k8s.io/client-go/dynamic"
|
||||
"k8s.io/client-go/rest"
|
||||
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
|
||||
workv1alpha2 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha2"
|
||||
|
@ -30,8 +31,26 @@ import (
|
|||
)
|
||||
|
||||
var (
|
||||
promoteShort = `Promote resources from legacy clusters to karmada control plane`
|
||||
promoteLong = `Promote resources from legacy clusters to karmada control plane. Requires the cluster be joined or registered.`
|
||||
promoteShort = `Promote resources from legacy clusters to karmada control plane`
|
||||
promoteLong = `Promote resources from legacy clusters to karmada control plane. Requires the cluster be joined or registered.`
|
||||
promoteExample = templates.Examples(`
|
||||
# Promote deployment(default/nginx) from cluster1 to Karmada
|
||||
%[1]s promote deployment nginx -n default -C cluster1
|
||||
|
||||
# Promote deployment(default/nginx) with gvk from cluster1 to Karmada
|
||||
%[1]s promote deployment.v1.apps nginx -n default -C cluster1
|
||||
|
||||
# Dumps the artifacts but does not deploy them to Karmada, same as 'dry run'
|
||||
%[1]s promote deployment nginx -n default -C cluster1 -o yaml|json
|
||||
|
||||
# Promote secret(default/default-token) from cluster1 to Karmada
|
||||
%[1]s promote secret default-token -n default -C cluster1
|
||||
|
||||
# Support to use '--cluster-kubeconfig' to specify the configuration of member cluster
|
||||
%[1]s promote deployment nginx -n default -C cluster1 --cluster-kubeconfig=<CLUSTER_KUBECONFIG_PATH>
|
||||
|
||||
# Support to use '--cluster-kubeconfig' and '--cluster-context' to specify the configuration of member cluster
|
||||
%[1]s promote deployment nginx -n default -C cluster1 --cluster-kubeconfig=<CLUSTER_KUBECONFIG_PATH> --cluster-context=<CLUSTER_CONTEXT>`)
|
||||
)
|
||||
|
||||
// NewCmdPromote defines the `promote` command that promote resources from legacy clusters
|
||||
|
@ -43,7 +62,7 @@ func NewCmdPromote(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Com
|
|||
Use: "promote <RESOURCE_TYPE> <RESOURCE_NAME> -n <NAME_SPACE> -C <CLUSTER_NAME>",
|
||||
Short: promoteShort,
|
||||
Long: promoteLong,
|
||||
Example: promoteExample(parentCommand),
|
||||
Example: fmt.Sprintf(promoteExample, parentCommand),
|
||||
SilenceUsage: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := opts.Complete(args); err != nil {
|
||||
|
@ -65,28 +84,6 @@ func NewCmdPromote(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Com
|
|||
return cmd
|
||||
}
|
||||
|
||||
func promoteExample(parentCommand string) string {
|
||||
example := `
|
||||
# Promote deployment(default/nginx) from cluster1 to Karmada` + "\n" +
|
||||
fmt.Sprintf("%s promote deployment nginx -n default -C cluster1", parentCommand) + `
|
||||
|
||||
# Promote deployment(default/nginx) with gvk from cluster1 to Karmada` + "\n" +
|
||||
fmt.Sprintf("%s promote deployment.v1.apps nginx -n default -C cluster1", parentCommand) + `
|
||||
|
||||
# Dumps the artifacts but does not deploy them to Karmada, same as 'dry run'` + "\n" +
|
||||
fmt.Sprintf("%s promote deployment nginx -n default -C cluster1 -o yaml|json", parentCommand) + `
|
||||
|
||||
# Promote secret(default/default-token) from cluster1 to Karmada` + "\n" +
|
||||
fmt.Sprintf("%s promote secret default-token -n default -C cluster1", parentCommand) + `
|
||||
|
||||
# Support to use '--cluster-kubeconfig' to specify the configuration of member cluster` + "\n" +
|
||||
fmt.Sprintf("%s promote deployment nginx -n default -C cluster1 --cluster-kubeconfig=<CLUSTER_KUBECONFIG_PATH>", parentCommand) + `
|
||||
|
||||
# Support to use '--cluster-kubeconfig' and '--cluster-context' to specify the configuration of member cluster` + "\n" +
|
||||
fmt.Sprintf("%s promote deployment nginx -n default -C cluster1 --cluster-kubeconfig=<CLUSTER_KUBECONFIG_PATH> --cluster-context=<CLUSTER_CONTEXT>", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// CommandPromoteOption holds all command options for promote
|
||||
type CommandPromoteOption struct {
|
||||
options.GlobalCommandOptions
|
||||
|
|
|
@ -17,6 +17,7 @@ import (
|
|||
"k8s.io/cli-runtime/pkg/genericclioptions"
|
||||
"k8s.io/cli-runtime/pkg/resource"
|
||||
cmdutil "k8s.io/kubectl/pkg/cmd/util"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
|
||||
karmadaclientset "github.com/karmada-io/karmada/pkg/generated/clientset/versioned"
|
||||
|
@ -33,8 +34,21 @@ const (
|
|||
)
|
||||
|
||||
var (
|
||||
taintShort = `Update the taints on one or more clusters`
|
||||
taintLong = `Update the taints on one or more clusters.`
|
||||
taintShort = `Update the taints on one or more clusters`
|
||||
taintLong = `Update the taints on one or more clusters.`
|
||||
taintExample = templates.Examples(`
|
||||
# Update cluster 'foo' with a taint with key 'dedicated' and value 'special-user' and effect 'NoSchedule'
|
||||
# If a taint with that key and effect already exists, its value is replaced as specified
|
||||
%[1]s taint clusters foo dedicated=special-user:NoSchedule
|
||||
|
||||
# Remove from cluster 'foo' the taint with key 'dedicated' and effect 'NoSchedule' if one exists
|
||||
%[1]s taint clusters foo dedicated:NoSchedule-
|
||||
|
||||
# Remove from cluster 'foo' all the taints with key 'dedicated'
|
||||
%[1]s taint clusters foo dedicated-
|
||||
|
||||
# Add to cluster 'foo' a taint with key 'bar' and no value
|
||||
%[1]s taint clusters foo bar:NoSchedule`)
|
||||
)
|
||||
|
||||
// NewCmdTaint defines the `taint` command that mark cluster with taints
|
||||
|
@ -45,7 +59,7 @@ func NewCmdTaint(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comma
|
|||
Use: "taint CLUSTER NAME KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N",
|
||||
Short: taintShort,
|
||||
Long: taintLong,
|
||||
Example: taintExample(parentCommand),
|
||||
Example: fmt.Sprintf(taintExample, parentCommand),
|
||||
SilenceUsage: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := opts.Complete(args); err != nil {
|
||||
|
@ -67,23 +81,6 @@ func NewCmdTaint(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comma
|
|||
return cmd
|
||||
}
|
||||
|
||||
func taintExample(parentCommand string) string {
|
||||
example := `
|
||||
# Update cluster 'foo' with a taint with key 'dedicated' and value 'special-user' and effect 'NoSchedule'
|
||||
# If a taint with that key and effect already exists, its value is replaced as specified` + "\n" +
|
||||
fmt.Sprintf("%s taint clusters foo dedicated=special-user:NoSchedule", parentCommand) + `
|
||||
|
||||
# Remove from cluster 'foo' the taint with key 'dedicated' and effect 'NoSchedule' if one exists` + "\n" +
|
||||
fmt.Sprintf("%s taint clusters foo dedicated:NoSchedule-", parentCommand) + `
|
||||
|
||||
# Remove from cluster 'foo' all the taints with key 'dedicated'` + "\n" +
|
||||
fmt.Sprintf("%s taint clusters foo dedicated-", parentCommand) + `
|
||||
|
||||
# Add to cluster 'foo' a taint with key 'bar' and no value` + "\n" +
|
||||
fmt.Sprintf("%s taint clusters foo bar:NoSchedule", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// CommandTaintOption holds all command options for taint
|
||||
type CommandTaintOption struct {
|
||||
options.GlobalCommandOptions
|
||||
|
|
|
@ -14,6 +14,7 @@ import (
|
|||
kubeclient "k8s.io/client-go/kubernetes"
|
||||
"k8s.io/client-go/rest"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
karmadaclientset "github.com/karmada-io/karmada/pkg/generated/clientset/versioned"
|
||||
"github.com/karmada-io/karmada/pkg/karmadactl/options"
|
||||
|
@ -22,8 +23,17 @@ import (
|
|||
)
|
||||
|
||||
var (
|
||||
unjoinShort = `Remove the registration of a cluster from control plane`
|
||||
unjoinLong = `Unjoin removes the registration of a cluster from control plane.`
|
||||
unjoinShort = `Remove the registration of a cluster from control plane`
|
||||
unjoinLong = `Unjoin removes the registration of a cluster from control plane.`
|
||||
unjoinExample = templates.Examples(`
|
||||
# Unjoin cluster from karamada control plane, but not to remove resources created by karmada in the unjoining cluster
|
||||
%[1]s unjoin CLUSTER_NAME
|
||||
|
||||
# Unjoin cluster from karamada control plane and attempt to remove resources created by karmada in the unjoining cluster
|
||||
%[1]s unjoin CLUSTER_NAME --cluster-kubeconfig=<KUBECONFIG>
|
||||
|
||||
# Unjoin cluster from karamada control plane with timeout
|
||||
%[1]s unjoin CLUSTER_NAME --cluster-kubeconfig=<KUBECONFIG> --wait 2m`)
|
||||
)
|
||||
|
||||
// NewCmdUnjoin defines the `unjoin` command that removes registration of a cluster from control plane.
|
||||
|
@ -34,7 +44,7 @@ func NewCmdUnjoin(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comm
|
|||
Use: "unjoin CLUSTER_NAME --cluster-kubeconfig=<KUBECONFIG>",
|
||||
Short: unjoinShort,
|
||||
Long: unjoinLong,
|
||||
Example: unjoinExample(parentCommand),
|
||||
Example: fmt.Sprintf(unjoinExample, parentCommand),
|
||||
SilenceUsage: true,
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
if err := opts.Complete(args); err != nil {
|
||||
|
@ -56,19 +66,6 @@ func NewCmdUnjoin(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comm
|
|||
return cmd
|
||||
}
|
||||
|
||||
func unjoinExample(parentCommand string) string {
|
||||
example := `
|
||||
# Unjoin cluster from karamada control plane, but not to remove resources created by karmada in the unjoining cluster` + "\n" +
|
||||
fmt.Sprintf("%s unjoin CLUSTER_NAME", parentCommand) + `
|
||||
|
||||
# Unjoin cluster from karamada control plane and attempt to remove resources created by karmada in the unjoining cluster` + "\n" +
|
||||
fmt.Sprintf("%s unjoin CLUSTER_NAME --cluster-kubeconfig=<KUBECONFIG>", parentCommand) + `
|
||||
|
||||
# Unjoin cluster from karamada control plane with timeout` + "\n" +
|
||||
fmt.Sprintf("%s unjoin CLUSTER_NAME --cluster-kubeconfig=<KUBECONFIG> --wait 2m", parentCommand)
|
||||
return example
|
||||
}
|
||||
|
||||
// CommandUnjoinOption holds all command options.
|
||||
type CommandUnjoinOption struct {
|
||||
options.GlobalCommandOptions
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"os"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"k8s.io/kubectl/pkg/util/templates"
|
||||
|
||||
"github.com/karmada-io/karmada/pkg/version"
|
||||
)
|
||||
|
@ -12,8 +13,9 @@ import (
|
|||
var (
|
||||
versionShort = `Print the version information`
|
||||
versionLong = `Print the version information.`
|
||||
versionExample = ` # Print %s command version
|
||||
%s version`
|
||||
versionExample = templates.Examples(`
|
||||
# Print %[1]s command version
|
||||
%[1]s version`)
|
||||
)
|
||||
|
||||
// NewCmdVersion prints out the release version info for this command binary.
|
||||
|
@ -23,7 +25,7 @@ func NewCmdVersion(parentCommand string) *cobra.Command {
|
|||
Use: "version",
|
||||
Short: versionShort,
|
||||
Long: versionLong,
|
||||
Example: fmt.Sprintf(versionExample, parentCommand, parentCommand),
|
||||
Example: fmt.Sprintf(versionExample, parentCommand),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
fmt.Fprintf(os.Stdout, "%s version: %s\n", parentCommand, version.Get())
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue