1
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
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
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
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
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
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
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