...

Source file src/k8s.io/kubectl/pkg/cmd/create/create_priorityclass.go

Documentation: k8s.io/kubectl/pkg/cmd/create

     1  /*
     2  Copyright 2017 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package create
    18  
    19  import (
    20  	"context"
    21  	"fmt"
    22  
    23  	"github.com/spf13/cobra"
    24  
    25  	corev1 "k8s.io/api/core/v1"
    26  	schedulingv1 "k8s.io/api/scheduling/v1"
    27  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    28  	"k8s.io/apimachinery/pkg/runtime"
    29  	"k8s.io/cli-runtime/pkg/genericclioptions"
    30  	"k8s.io/cli-runtime/pkg/genericiooptions"
    31  	schedulingv1client "k8s.io/client-go/kubernetes/typed/scheduling/v1"
    32  	cmdutil "k8s.io/kubectl/pkg/cmd/util"
    33  	"k8s.io/kubectl/pkg/scheme"
    34  	"k8s.io/kubectl/pkg/util"
    35  	"k8s.io/kubectl/pkg/util/i18n"
    36  	"k8s.io/kubectl/pkg/util/templates"
    37  )
    38  
    39  var (
    40  	pcLong = templates.LongDesc(i18n.T(`
    41  		Create a priority class with the specified name, value, globalDefault and description.`))
    42  
    43  	pcExample = templates.Examples(i18n.T(`
    44  		# Create a priority class named high-priority
    45  		kubectl create priorityclass high-priority --value=1000 --description="high priority"
    46  
    47  		# Create a priority class named default-priority that is considered as the global default priority
    48  		kubectl create priorityclass default-priority --value=1000 --global-default=true --description="default priority"
    49  
    50  		# Create a priority class named high-priority that cannot preempt pods with lower priority
    51  		kubectl create priorityclass high-priority --value=1000 --description="high priority" --preemption-policy="Never"`))
    52  )
    53  
    54  // PriorityClassOptions holds the options for 'create priorityclass' sub command
    55  type PriorityClassOptions struct {
    56  	PrintFlags *genericclioptions.PrintFlags
    57  	PrintObj   func(obj runtime.Object) error
    58  
    59  	Name             string
    60  	Value            int32
    61  	GlobalDefault    bool
    62  	Description      string
    63  	PreemptionPolicy string
    64  	FieldManager     string
    65  	CreateAnnotation bool
    66  
    67  	Client              *schedulingv1client.SchedulingV1Client
    68  	DryRunStrategy      cmdutil.DryRunStrategy
    69  	ValidationDirective string
    70  
    71  	genericiooptions.IOStreams
    72  }
    73  
    74  // NewPriorityClassOptions returns an initialized PriorityClassOptions instance
    75  func NewPriorityClassOptions(ioStreams genericiooptions.IOStreams) *PriorityClassOptions {
    76  	return &PriorityClassOptions{
    77  		Value:            0,
    78  		PreemptionPolicy: "PreemptLowerPriority",
    79  		PrintFlags:       genericclioptions.NewPrintFlags("created").WithTypeSetter(scheme.Scheme),
    80  		IOStreams:        ioStreams,
    81  	}
    82  }
    83  
    84  // NewCmdCreatePriorityClass is a macro command to create a new priorityClass.
    85  func NewCmdCreatePriorityClass(f cmdutil.Factory, ioStreams genericiooptions.IOStreams) *cobra.Command {
    86  	o := NewPriorityClassOptions(ioStreams)
    87  
    88  	cmd := &cobra.Command{
    89  		Use:                   "priorityclass NAME --value=VALUE --global-default=BOOL [--dry-run=server|client|none]",
    90  		DisableFlagsInUseLine: true,
    91  		Aliases:               []string{"pc"},
    92  		Short:                 i18n.T("Create a priority class with the specified name"),
    93  		Long:                  pcLong,
    94  		Example:               pcExample,
    95  		Run: func(cmd *cobra.Command, args []string) {
    96  			cmdutil.CheckErr(o.Complete(f, cmd, args))
    97  			cmdutil.CheckErr(o.Run())
    98  		},
    99  	}
   100  
   101  	o.PrintFlags.AddFlags(cmd)
   102  
   103  	cmdutil.AddApplyAnnotationFlags(cmd)
   104  	cmdutil.AddValidateFlags(cmd)
   105  	cmdutil.AddDryRunFlag(cmd)
   106  	cmd.Flags().Int32Var(&o.Value, "value", o.Value, i18n.T("the value of this priority class."))
   107  	cmd.Flags().BoolVar(&o.GlobalDefault, "global-default", o.GlobalDefault, i18n.T("global-default specifies whether this PriorityClass should be considered as the default priority."))
   108  	cmd.Flags().StringVar(&o.Description, "description", o.Description, i18n.T("description is an arbitrary string that usually provides guidelines on when this priority class should be used."))
   109  	cmd.Flags().StringVar(&o.PreemptionPolicy, "preemption-policy", o.PreemptionPolicy, i18n.T("preemption-policy is the policy for preempting pods with lower priority."))
   110  	cmdutil.AddFieldManagerFlagVar(cmd, &o.FieldManager, "kubectl-create")
   111  	return cmd
   112  }
   113  
   114  // Complete completes all the required options
   115  func (o *PriorityClassOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string) error {
   116  	var err error
   117  	o.Name, err = NameFromCommandArgs(cmd, args)
   118  	if err != nil {
   119  		return err
   120  	}
   121  
   122  	restConfig, err := f.ToRESTConfig()
   123  	if err != nil {
   124  		return err
   125  	}
   126  	o.Client, err = schedulingv1client.NewForConfig(restConfig)
   127  	if err != nil {
   128  		return err
   129  	}
   130  
   131  	o.CreateAnnotation = cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag)
   132  
   133  	o.DryRunStrategy, err = cmdutil.GetDryRunStrategy(cmd)
   134  	if err != nil {
   135  		return err
   136  	}
   137  	cmdutil.PrintFlagsWithDryRunStrategy(o.PrintFlags, o.DryRunStrategy)
   138  
   139  	printer, err := o.PrintFlags.ToPrinter()
   140  	if err != nil {
   141  		return err
   142  	}
   143  	o.PrintObj = func(obj runtime.Object) error {
   144  		return printer.PrintObj(obj, o.Out)
   145  	}
   146  
   147  	o.ValidationDirective, err = cmdutil.GetValidationDirective(cmd)
   148  	if err != nil {
   149  		return err
   150  	}
   151  
   152  	return nil
   153  }
   154  
   155  // Run calls the CreateSubcommandOptions.Run in the PriorityClassOptions instance
   156  func (o *PriorityClassOptions) Run() error {
   157  	priorityClass, err := o.createPriorityClass()
   158  	if err != nil {
   159  		return err
   160  	}
   161  
   162  	if err := util.CreateOrUpdateAnnotation(o.CreateAnnotation, priorityClass, scheme.DefaultJSONEncoder()); err != nil {
   163  		return err
   164  	}
   165  
   166  	if o.DryRunStrategy != cmdutil.DryRunClient {
   167  		createOptions := metav1.CreateOptions{}
   168  		if o.FieldManager != "" {
   169  			createOptions.FieldManager = o.FieldManager
   170  		}
   171  		createOptions.FieldValidation = o.ValidationDirective
   172  		if o.DryRunStrategy == cmdutil.DryRunServer {
   173  			createOptions.DryRun = []string{metav1.DryRunAll}
   174  		}
   175  		var err error
   176  		priorityClass, err = o.Client.PriorityClasses().Create(context.TODO(), priorityClass, createOptions)
   177  		if err != nil {
   178  			return fmt.Errorf("failed to create priorityclass: %v", err)
   179  		}
   180  	}
   181  
   182  	return o.PrintObj(priorityClass)
   183  }
   184  
   185  func (o *PriorityClassOptions) createPriorityClass() (*schedulingv1.PriorityClass, error) {
   186  	preemptionPolicy := corev1.PreemptionPolicy(o.PreemptionPolicy)
   187  	return &schedulingv1.PriorityClass{
   188  		// this is ok because we know exactly how we want to be serialized
   189  		TypeMeta: metav1.TypeMeta{APIVersion: schedulingv1.SchemeGroupVersion.String(), Kind: "PriorityClass"},
   190  		ObjectMeta: metav1.ObjectMeta{
   191  			Name: o.Name,
   192  		},
   193  		Value:            o.Value,
   194  		GlobalDefault:    o.GlobalDefault,
   195  		Description:      o.Description,
   196  		PreemptionPolicy: &preemptionPolicy,
   197  	}, nil
   198  }
   199  

View as plain text