karmadactl apply uses factory to access member cluster

Signed-off-by: helen <helenfrank@protonmail.com>
This commit is contained in:
helen 2022-09-23 00:40:02 +08:00
parent 2a0610eb00
commit 0f5754ad14
3 changed files with 16 additions and 28 deletions

View File

@ -12,14 +12,12 @@ import (
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/cli-runtime/pkg/resource"
restclient "k8s.io/client-go/rest"
kubectlapply "k8s.io/kubectl/pkg/cmd/apply"
cmdutil "k8s.io/kubectl/pkg/cmd/util"
"k8s.io/kubectl/pkg/util/templates"
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
karmadaclientset "github.com/karmada-io/karmada/pkg/generated/clientset/versioned"
"github.com/karmada-io/karmada/pkg/karmadactl/options"
"github.com/karmada-io/karmada/pkg/karmadactl/util"
"github.com/karmada-io/karmada/pkg/util/names"
)
@ -27,11 +25,8 @@ var metadataAccessor = meta.NewAccessor()
// CommandApplyOptions contains the input to the apply command.
type CommandApplyOptions struct {
// global flags
options.GlobalCommandOptions
// apply flags
KubectlApplyFlags *kubectlapply.ApplyFlags
Namespace string
AllClusters bool
Clusters []string
@ -48,8 +43,8 @@ var (
JSON and YAML formats are accepted.
Alpha Disclaimer: the --prune functionality is not yet complete. Do not use unless you are aware of what the current state is. See https://issues.k8s.io/34274.
Note: It implements the function of 'kubectl apply' by default.
Note: It implements the function of 'kubectl apply' by default.
If you want to propagate them into member clusters, please use %[1]s apply --all-clusters'.`)
applyExample = templates.Examples(`
@ -68,7 +63,7 @@ var (
)
// NewCmdApply creates the `apply` command
func NewCmdApply(karmadaConfig KarmadaConfig, parentCommand string, streams genericclioptions.IOStreams) *cobra.Command {
func NewCmdApply(f util.Factory, parentCommand string, streams genericclioptions.IOStreams) *cobra.Command {
o := &CommandApplyOptions{
KubectlApplyFlags: kubectlapply.NewApplyFlags(nil, streams),
}
@ -80,7 +75,7 @@ func NewCmdApply(karmadaConfig KarmadaConfig, parentCommand string, streams gene
DisableFlagsInUseLine: true,
Example: fmt.Sprintf(applyExample, parentCommand),
RunE: func(cmd *cobra.Command, args []string) error {
if err := o.Complete(karmadaConfig, cmd, parentCommand, args); err != nil {
if err := o.Complete(f, cmd, parentCommand, args); err != nil {
return err
}
if err := o.Validate(cmd, args); err != nil {
@ -90,30 +85,24 @@ func NewCmdApply(karmadaConfig KarmadaConfig, parentCommand string, streams gene
},
}
o.GlobalCommandOptions.AddFlags(cmd.Flags())
o.KubectlApplyFlags.AddFlags(cmd)
cmd.Flags().StringVarP(&o.Namespace, "namespace", "n", o.Namespace, "If present, the namespace scope for this CLI request")
cmd.Flags().BoolVarP(&o.AllClusters, "all-clusters", "", o.AllClusters, "If present, propagates a group of resources to all member clusters.")
cmd.Flags().StringSliceVarP(&o.Clusters, "cluster", "C", o.Clusters, "If present, propagates a group of resources to specified clusters.")
flags := cmd.Flags()
flags.BoolVarP(&o.AllClusters, "all-clusters", "", o.AllClusters, "If present, propagates a group of resources to all member clusters.")
flags.StringSliceVarP(&o.Clusters, "cluster", "C", o.Clusters, "If present, propagates a group of resources to specified clusters.")
flags.StringVar(defaultConfigFlags.KubeConfig, "kubeconfig", *defaultConfigFlags.KubeConfig, "Path to the kubeconfig file to use for CLI requests.")
flags.StringVar(defaultConfigFlags.Context, "karmada-context", *defaultConfigFlags.Context, "The name of the kubeconfig context to use")
flags.StringVarP(defaultConfigFlags.Namespace, "namespace", "n", *defaultConfigFlags.Namespace, "If present, the namespace scope for this CLI request")
return cmd
}
// Complete completes all the required options
func (o *CommandApplyOptions) Complete(karmadaConfig KarmadaConfig, cmd *cobra.Command, parentCommand string, args []string) error {
restConfig, err := karmadaConfig.GetRestConfig(o.KarmadaContext, o.KubeConfig)
if err != nil {
return err
}
karmadaClient, err := karmadaclientset.NewForConfig(restConfig)
func (o *CommandApplyOptions) Complete(f util.Factory, cmd *cobra.Command, parentCommand string, args []string) error {
karmadaClient, err := f.KarmadaClientSet()
if err != nil {
return err
}
o.karmadaClient = karmadaClient
kubeConfigFlags := NewConfigFlags(true).WithDeprecatedPasswordFlag()
kubeConfigFlags.Namespace = &o.Namespace
kubeConfigFlags.WrapConfigFn = func(config *restclient.Config) *restclient.Config { return restConfig }
o.KubectlApplyFlags.Factory = cmdutil.NewFactory(kubeConfigFlags)
o.KubectlApplyFlags.Factory = f
kubectlApplyOptions, err := o.KubectlApplyFlags.ToOptions(cmd, parentCommand, args)
if err != nil {
return err
@ -179,7 +168,7 @@ func (o *CommandApplyOptions) generateAndInjectPolices() error {
if err != nil {
return fmt.Errorf("unable to recognize resource: %v", err)
}
client, err := o.KubectlApplyFlags.Factory.ClientForMapping(mapping)
client, err := o.KubectlApplyFlags.Factory.UnstructuredClientForMapping(mapping)
if err != nil {
return fmt.Errorf("unable to connect to a server to handle %q: %v", mapping.Resource, err)
}

View File

@ -95,7 +95,7 @@ func NewKarmadaCtlCommand(cmdUse, parentCommand string) *cobra.Command {
{
Message: "Advanced Commands:",
Commands: []*cobra.Command{
NewCmdApply(karmadaConfig, parentCommand, ioStreams),
NewCmdApply(f, parentCommand, ioStreams),
NewCmdPromote(karmadaConfig, parentCommand),
},
},

View File

@ -21,7 +21,6 @@ type Factory interface {
// KarmadaClientSet returns a karmada clientset
KarmadaClientSet() (karmadaclientset.Interface, error)
// FactoryForMemberCluster returns a cmdutil.Factory for the member cluster
FactoryForMemberCluster(clusterName string) (cmdutil.Factory, error)
}