Merge pull request #2611 from helen-frank/feature/cordonFactory

karmadactl cordon&uncordon uses factory to access cluster
This commit is contained in:
karmada-bot 2022-10-13 18:56:26 +08:00 committed by GitHub
commit 3e8ed1db96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 32 deletions

View File

@ -15,7 +15,7 @@ import (
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/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"
)
var (
@ -42,7 +42,7 @@ const (
)
// NewCmdCordon defines the `cordon` command that mark cluster as unschedulable.
func NewCmdCordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Command {
func NewCmdCordon(f util.Factory, parentCommand string) *cobra.Command {
opts := CommandCordonOption{}
cmd := &cobra.Command{
Use: "cordon CLUSTER",
@ -55,7 +55,7 @@ func NewCmdCordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comm
if err := opts.Complete(args); err != nil {
return err
}
if err := RunCordonOrUncordon(DesiredCordon, karmadaConfig, opts); err != nil {
if err := RunCordonOrUncordon(DesiredCordon, f, opts); err != nil {
return err
}
return nil
@ -63,15 +63,16 @@ func NewCmdCordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Comm
}
flags := cmd.Flags()
opts.GlobalCommandOptions.AddFlags(flags)
flags.BoolVar(&opts.DryRun, "dry-run", false, "Run the command in dry-run mode, without making any server requests.")
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
}
// NewCmdUncordon defines the `uncordon` command that mark cluster as schedulable.
func NewCmdUncordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Command {
func NewCmdUncordon(f util.Factory, parentCommand string) *cobra.Command {
opts := CommandCordonOption{}
cmd := &cobra.Command{
Use: "uncordon CLUSTER",
@ -84,7 +85,7 @@ func NewCmdUncordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Co
if err := opts.Complete(args); err != nil {
return err
}
if err := RunCordonOrUncordon(DesiredUnCordon, karmadaConfig, opts); err != nil {
if err := RunCordonOrUncordon(DesiredUnCordon, f, opts); err != nil {
return err
}
return nil
@ -92,16 +93,15 @@ func NewCmdUncordon(karmadaConfig KarmadaConfig, parentCommand string) *cobra.Co
}
flags := cmd.Flags()
opts.AddFlags(flags)
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
}
// CommandCordonOption holds all command options for cordon and uncordon
type CommandCordonOption struct {
// global flags
options.GlobalCommandOptions
// ClusterName is the cluster's name that we are going to join with.
ClusterName string
@ -170,8 +170,8 @@ func (c *CordonHelper) hasUnschedulerTaint() bool {
// PatchOrReplace uses given karmada clientset to update the cluster unschedulable scheduler, either by patching or
// updating the given cluster object; it may return error if the object cannot be encoded as
// JSON, or if either patch or update calls fail; it will also return error whenever creating a patch has failed
func (c *CordonHelper) PatchOrReplace(controlPlaneClient *karmadaclientset.Clientset) error {
client := controlPlaneClient.ClusterV1alpha1().Clusters()
func (c *CordonHelper) PatchOrReplace(karmadaClient karmadaclientset.Interface) error {
client := karmadaClient.ClusterV1alpha1().Clusters()
oldData, err := json.Marshal(c.cluster)
if err != nil {
return err
@ -212,22 +212,18 @@ func (c *CordonHelper) PatchOrReplace(controlPlaneClient *karmadaclientset.Clien
// RunCordonOrUncordon exec marks the cluster unschedulable or schedulable according to desired.
// if true cordon cluster otherwise uncordon cluster.
func RunCordonOrUncordon(desired int, karmadaConfig KarmadaConfig, opts CommandCordonOption) error {
func RunCordonOrUncordon(desired int, f util.Factory, opts CommandCordonOption) error {
cordonOrUncordon := "cordon"
if desired == DesiredUnCordon {
cordonOrUncordon = "un" + cordonOrUncordon
}
// Get control plane kube-apiserver client
controlPlaneRestConfig, err := karmadaConfig.GetRestConfig(opts.KarmadaContext, opts.KubeConfig)
karmadaClient, err := f.KarmadaClientSet()
if err != nil {
return fmt.Errorf("failed to get control plane rest config. context: %s, kube-config: %s, error: %v",
opts.KarmadaContext, opts.KubeConfig, err)
return err
}
controlPlaneKarmadaClient := karmadaclientset.NewForConfigOrDie(controlPlaneRestConfig)
cluster, err := controlPlaneKarmadaClient.ClusterV1alpha1().Clusters().Get(context.TODO(), opts.ClusterName, metav1.GetOptions{})
cluster, err := karmadaClient.ClusterV1alpha1().Clusters().Get(context.TODO(), opts.ClusterName, metav1.GetOptions{})
if err != nil {
return err
}
@ -239,7 +235,7 @@ func RunCordonOrUncordon(desired int, karmadaConfig KarmadaConfig, opts CommandC
}
if !opts.DryRun {
err := cordonHelper.PatchOrReplace(controlPlaneKarmadaClient)
err := cordonHelper.PatchOrReplace(karmadaClient)
if err != nil {
return err
}

View File

@ -79,8 +79,8 @@ func NewKarmadaCtlCommand(cmdUse, parentCommand string) *cobra.Command {
{
Message: "Cluster Management Commands:",
Commands: []*cobra.Command{
NewCmdCordon(karmadaConfig, parentCommand),
NewCmdUncordon(karmadaConfig, parentCommand),
NewCmdCordon(f, parentCommand),
NewCmdUncordon(f, parentCommand),
NewCmdTaint(karmadaConfig, parentCommand),
},
},

View File

@ -14,6 +14,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/rand"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/klog/v2"
@ -23,6 +24,7 @@ import (
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
"github.com/karmada-io/karmada/pkg/karmadactl"
"github.com/karmada-io/karmada/pkg/karmadactl/options"
cmdutil "github.com/karmada-io/karmada/pkg/karmadactl/util"
"github.com/karmada-io/karmada/pkg/util"
khelper "github.com/karmada-io/karmada/pkg/util/helper"
"github.com/karmada-io/karmada/pkg/util/names"
@ -463,6 +465,7 @@ var _ = framework.SerialDescribe("Karmadactl cordon/uncordon testing", ginkgo.La
var kubeConfigPath string
var clusterContext string
var karmadaConfig karmadactl.KarmadaConfig
var f cmdutil.Factory
ginkgo.BeforeEach(func() {
clusterName = "member-e2e-" + rand.String(3)
@ -472,6 +475,9 @@ var _ = framework.SerialDescribe("Karmadactl cordon/uncordon testing", ginkgo.La
clusterContext = fmt.Sprintf("kind-%s", clusterName)
karmadaConfig = karmadactl.NewKarmadaConfig(clientcmd.NewDefaultPathOptions())
defaultConfigFlags := genericclioptions.NewConfigFlags(true).WithDeprecatedPasswordFlag().WithDiscoveryBurst(300).WithDiscoveryQPS(50.0)
defaultConfigFlags.Context = &karmadaContext
f = cmdutil.NewFactory(defaultConfigFlags)
})
ginkgo.BeforeEach(func() {
@ -527,13 +533,10 @@ var _ = framework.SerialDescribe("Karmadactl cordon/uncordon testing", ginkgo.La
ginkgo.Context("cordon/uncordon cluster taint check", func() {
ginkgo.BeforeEach(func() {
opts := karmadactl.CommandCordonOption{
GlobalCommandOptions: options.GlobalCommandOptions{
KarmadaContext: karmadaContext,
},
DryRun: false,
ClusterName: clusterName,
}
err := karmadactl.RunCordonOrUncordon(karmadactl.DesiredCordon, karmadaConfig, opts)
err := karmadactl.RunCordonOrUncordon(karmadactl.DesiredCordon, f, opts)
gomega.Expect(err).ShouldNot(gomega.HaveOccurred())
})
@ -554,13 +557,10 @@ var _ = framework.SerialDescribe("Karmadactl cordon/uncordon testing", ginkgo.La
ginkgo.It(fmt.Sprintf("cluster %s should not have unschedulable:NoSchedule taint", clusterName), func() {
opts := karmadactl.CommandCordonOption{
GlobalCommandOptions: options.GlobalCommandOptions{
KarmadaContext: karmadaContext,
},
DryRun: false,
ClusterName: clusterName,
}
err := karmadactl.RunCordonOrUncordon(karmadactl.DesiredUnCordon, karmadaConfig, opts)
err := karmadactl.RunCordonOrUncordon(karmadactl.DesiredUnCordon, f, opts)
gomega.Expect(err).ShouldNot(gomega.HaveOccurred())
ginkgo.By(fmt.Sprintf("cluster %s taint(unschedulable:NoSchedule) will be removed", clusterName), func() {