create_cronjob.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /*
  2. Copyright 2018 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package create
  14. import (
  15. "fmt"
  16. "github.com/spf13/cobra"
  17. batchv1 "k8s.io/api/batch/v1"
  18. batchv1beta1 "k8s.io/api/batch/v1beta1"
  19. corev1 "k8s.io/api/core/v1"
  20. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  21. "k8s.io/apimachinery/pkg/runtime"
  22. "k8s.io/cli-runtime/pkg/genericclioptions"
  23. "k8s.io/cli-runtime/pkg/resource"
  24. batchv1beta1client "k8s.io/client-go/kubernetes/typed/batch/v1beta1"
  25. cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
  26. "k8s.io/kubernetes/pkg/kubectl/scheme"
  27. "k8s.io/kubernetes/pkg/kubectl/util/templates"
  28. )
  29. var (
  30. cronjobLong = templates.LongDesc(`
  31. Create a cronjob with the specified name.`)
  32. cronjobExample = templates.Examples(`
  33. # Create a cronjob
  34. kubectl create cronjob my-job --image=busybox
  35. # Create a cronjob with command
  36. kubectl create cronjob my-job --image=busybox -- date
  37. # Create a cronjob with schedule
  38. kubectl create cronjob test-job --image=busybox --schedule="*/1 * * * *"`)
  39. )
  40. type CreateCronJobOptions struct {
  41. PrintFlags *genericclioptions.PrintFlags
  42. PrintObj func(obj runtime.Object) error
  43. Name string
  44. Image string
  45. Schedule string
  46. Command []string
  47. Restart string
  48. Namespace string
  49. Client batchv1beta1client.BatchV1beta1Interface
  50. DryRun bool
  51. Builder *resource.Builder
  52. Cmd *cobra.Command
  53. genericclioptions.IOStreams
  54. }
  55. func NewCreateCronJobOptions(ioStreams genericclioptions.IOStreams) *CreateCronJobOptions {
  56. return &CreateCronJobOptions{
  57. PrintFlags: genericclioptions.NewPrintFlags("created").WithTypeSetter(scheme.Scheme),
  58. IOStreams: ioStreams,
  59. }
  60. }
  61. // NewCmdCreateCronJob is a command to to create CronJobs.
  62. func NewCmdCreateCronJob(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command {
  63. o := NewCreateCronJobOptions(ioStreams)
  64. cmd := &cobra.Command{
  65. Use: "cronjob NAME --image=image --schedule='0/5 * * * ?' -- [COMMAND] [args...]",
  66. Aliases: []string{"cj"},
  67. Short: cronjobLong,
  68. Long: cronjobLong,
  69. Example: cronjobExample,
  70. Run: func(cmd *cobra.Command, args []string) {
  71. cmdutil.CheckErr(o.Complete(f, cmd, args))
  72. cmdutil.CheckErr(o.Validate())
  73. cmdutil.CheckErr(o.Run())
  74. },
  75. }
  76. o.PrintFlags.AddFlags(cmd)
  77. cmdutil.AddApplyAnnotationFlags(cmd)
  78. cmdutil.AddValidateFlags(cmd)
  79. cmdutil.AddDryRunFlag(cmd)
  80. cmd.Flags().StringVar(&o.Image, "image", o.Image, "Image name to run.")
  81. cmd.Flags().StringVar(&o.Schedule, "schedule", o.Schedule, "A schedule in the Cron format the job should be run with.")
  82. cmd.Flags().StringVar(&o.Restart, "restart", o.Restart, "job's restart policy. supported values: OnFailure, Never")
  83. return cmd
  84. }
  85. func (o *CreateCronJobOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string) error {
  86. name, err := NameFromCommandArgs(cmd, args)
  87. if err != nil {
  88. return err
  89. }
  90. o.Name = name
  91. if len(args) > 1 {
  92. o.Command = args[1:]
  93. }
  94. if len(o.Restart) == 0 {
  95. o.Restart = "OnFailure"
  96. }
  97. clientConfig, err := f.ToRESTConfig()
  98. if err != nil {
  99. return err
  100. }
  101. o.Client, err = batchv1beta1client.NewForConfig(clientConfig)
  102. if err != nil {
  103. return err
  104. }
  105. o.Namespace, _, err = f.ToRawKubeConfigLoader().Namespace()
  106. if err != nil {
  107. return err
  108. }
  109. o.Builder = f.NewBuilder()
  110. o.Cmd = cmd
  111. o.DryRun = cmdutil.GetDryRunFlag(cmd)
  112. if o.DryRun {
  113. o.PrintFlags.Complete("%s (dry run)")
  114. }
  115. printer, err := o.PrintFlags.ToPrinter()
  116. if err != nil {
  117. return err
  118. }
  119. o.PrintObj = func(obj runtime.Object) error {
  120. return printer.PrintObj(obj, o.Out)
  121. }
  122. return nil
  123. }
  124. func (o *CreateCronJobOptions) Validate() error {
  125. if len(o.Image) == 0 {
  126. return fmt.Errorf("--image must be specified")
  127. }
  128. if len(o.Schedule) == 0 {
  129. return fmt.Errorf("--schedule must be specified")
  130. }
  131. return nil
  132. }
  133. func (o *CreateCronJobOptions) Run() error {
  134. var cronjob *batchv1beta1.CronJob
  135. cronjob = o.createCronJob()
  136. if !o.DryRun {
  137. var err error
  138. cronjob, err = o.Client.CronJobs(o.Namespace).Create(cronjob)
  139. if err != nil {
  140. return fmt.Errorf("failed to create cronjob: %v", err)
  141. }
  142. }
  143. return o.PrintObj(cronjob)
  144. }
  145. func (o *CreateCronJobOptions) createCronJob() *batchv1beta1.CronJob {
  146. return &batchv1beta1.CronJob{
  147. TypeMeta: metav1.TypeMeta{APIVersion: batchv1beta1.SchemeGroupVersion.String(), Kind: "CronJob"},
  148. ObjectMeta: metav1.ObjectMeta{
  149. Name: o.Name,
  150. },
  151. Spec: batchv1beta1.CronJobSpec{
  152. Schedule: o.Schedule,
  153. JobTemplate: batchv1beta1.JobTemplateSpec{
  154. ObjectMeta: metav1.ObjectMeta{
  155. Name: o.Name,
  156. },
  157. Spec: batchv1.JobSpec{
  158. Template: corev1.PodTemplateSpec{
  159. Spec: corev1.PodSpec{
  160. Containers: []corev1.Container{
  161. {
  162. Name: o.Name,
  163. Image: o.Image,
  164. Command: o.Command,
  165. },
  166. },
  167. RestartPolicy: corev1.RestartPolicy(o.Restart),
  168. },
  169. },
  170. },
  171. },
  172. },
  173. }
  174. }