mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Enable batch/v1beta1.CronJobs by default
This commit is contained in:
		@@ -51,7 +51,6 @@ import (
 | 
				
			|||||||
	"k8s.io/apiserver/pkg/server/options/encryptionconfig"
 | 
						"k8s.io/apiserver/pkg/server/options/encryptionconfig"
 | 
				
			||||||
	serverstorage "k8s.io/apiserver/pkg/server/storage"
 | 
						serverstorage "k8s.io/apiserver/pkg/server/storage"
 | 
				
			||||||
	aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
 | 
						aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
 | 
				
			||||||
	//aggregatorinformers "k8s.io/kube-aggregator/pkg/client/informers/internalversion"
 | 
					 | 
				
			||||||
	openapi "k8s.io/kube-openapi/pkg/common"
 | 
						openapi "k8s.io/kube-openapi/pkg/common"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"k8s.io/apiserver/pkg/storage/etcd3/preflight"
 | 
						"k8s.io/apiserver/pkg/storage/etcd3/preflight"
 | 
				
			||||||
@@ -548,9 +547,8 @@ func BuildStorageFactory(s *options.ServerRunOptions) (*serverstorage.DefaultSto
 | 
				
			|||||||
	storageFactory, err := kubeapiserver.NewStorageFactory(
 | 
						storageFactory, err := kubeapiserver.NewStorageFactory(
 | 
				
			||||||
		s.Etcd.StorageConfig, s.Etcd.DefaultStorageMediaType, api.Codecs,
 | 
							s.Etcd.StorageConfig, s.Etcd.DefaultStorageMediaType, api.Codecs,
 | 
				
			||||||
		serverstorage.NewDefaultResourceEncodingConfig(api.Registry), storageGroupsToEncodingVersion,
 | 
							serverstorage.NewDefaultResourceEncodingConfig(api.Registry), storageGroupsToEncodingVersion,
 | 
				
			||||||
		// FIXME: this GroupVersionResource override should be configurable
 | 
							// FIXME (soltysh): this GroupVersionResource override should be configurable
 | 
				
			||||||
		// TODO we need to update this to batch/v1beta1 when it's enabled by default
 | 
							[]schema.GroupVersionResource{batch.Resource("cronjobs").WithVersion("v1beta1")},
 | 
				
			||||||
		[]schema.GroupVersionResource{batch.Resource("cronjobs").WithVersion("v2alpha1")},
 | 
					 | 
				
			||||||
		master.DefaultAPIResourceConfigSource(), s.APIEnablement.RuntimeConfig)
 | 
							master.DefaultAPIResourceConfigSource(), s.APIEnablement.RuntimeConfig)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, fmt.Errorf("error in initializing storage factory: %s", err)
 | 
							return nil, fmt.Errorf("error in initializing storage factory: %s", err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,6 @@ go_library(
 | 
				
			|||||||
        "//pkg/apis/authentication/install:go_default_library",
 | 
					        "//pkg/apis/authentication/install:go_default_library",
 | 
				
			||||||
        "//pkg/apis/authorization/install:go_default_library",
 | 
					        "//pkg/apis/authorization/install:go_default_library",
 | 
				
			||||||
        "//pkg/apis/autoscaling/install:go_default_library",
 | 
					        "//pkg/apis/autoscaling/install:go_default_library",
 | 
				
			||||||
        "//pkg/apis/batch:go_default_library",
 | 
					 | 
				
			||||||
        "//pkg/apis/batch/install:go_default_library",
 | 
					        "//pkg/apis/batch/install:go_default_library",
 | 
				
			||||||
        "//pkg/apis/certificates/install:go_default_library",
 | 
					        "//pkg/apis/certificates/install:go_default_library",
 | 
				
			||||||
        "//pkg/apis/componentconfig:go_default_library",
 | 
					        "//pkg/apis/componentconfig:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,8 +22,6 @@ package app
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
						"k8s.io/apimachinery/pkg/runtime/schema"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apis/batch"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/cronjob"
 | 
						"k8s.io/kubernetes/pkg/controller/cronjob"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller/job"
 | 
						"k8s.io/kubernetes/pkg/controller/job"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -41,14 +39,11 @@ func startJobController(ctx ControllerContext) (bool, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func startCronJobController(ctx ControllerContext) (bool, error) {
 | 
					func startCronJobController(ctx ControllerContext) (bool, error) {
 | 
				
			||||||
	if !ctx.AvailableResources[schema.GroupVersionResource{Group: "batch", Version: "v2alpha1", Resource: "cronjobs"}] {
 | 
						if !ctx.AvailableResources[schema.GroupVersionResource{Group: "batch", Version: "v1beta1", Resource: "cronjobs"}] {
 | 
				
			||||||
		return false, nil
 | 
							return false, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// TODO: this is a temp fix for allowing kubeClient list v2alpha1 sj, should switch to using clientset
 | 
					 | 
				
			||||||
	cronjobConfig := ctx.ClientBuilder.ConfigOrDie("cronjob-controller")
 | 
					 | 
				
			||||||
	cronjobConfig.ContentConfig.GroupVersion = &schema.GroupVersion{Group: batch.GroupName, Version: "v2alpha1"}
 | 
					 | 
				
			||||||
	go cronjob.NewCronJobController(
 | 
						go cronjob.NewCronJobController(
 | 
				
			||||||
		clientset.NewForConfigOrDie(cronjobConfig),
 | 
							ctx.ClientBuilder.ClientOrDie("cronjob-controller"),
 | 
				
			||||||
	).Run(ctx.Stop)
 | 
						).Run(ctx.Stop)
 | 
				
			||||||
	return true, nil
 | 
						return true, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1224,16 +1224,14 @@ run_kubectl_run_tests() {
 | 
				
			|||||||
  # Clean up
 | 
					  # Clean up
 | 
				
			||||||
  kubectl delete deployment nginx-apps "${kube_flags[@]}"
 | 
					  kubectl delete deployment nginx-apps "${kube_flags[@]}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # TODO: enable batch/v1beta1 by default before 1.8 release, after issues
 | 
					  # Pre-Condition: no Job exists
 | 
				
			||||||
  # with CronJobs existing in multiple versions at once is solved
 | 
					  kube::test::get_object_assert cronjob.v1beta1.batch "{{range.items}}{{$id_field}}:{{end}}" ''
 | 
				
			||||||
  # # Pre-Condition: no Job exists
 | 
					  # Command
 | 
				
			||||||
  # kube::test::get_object_assert cronjobs "{{range.items}}{{$id_field}}:{{end}}" ''
 | 
					  kubectl run pi --schedule="*/5 * * * *" --generator=cronjob/v1beta1 "--image=$IMAGE_PERL" --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(20)' "${kube_flags[@]}"
 | 
				
			||||||
  # # Command
 | 
					  # Post-Condition: CronJob "pi" is created
 | 
				
			||||||
  # kubectl run pi --schedule="*/5 * * * *" --generator=cronjob/v1beta1 "--image=$IMAGE_PERL" --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(20)' "${kube_flags[@]}"
 | 
					  kube::test::get_object_assert cronjob.v1beta1.batch "{{range.items}}{{$id_field}}:{{end}}" 'pi:'
 | 
				
			||||||
  # # Post-Condition: CronJob "pi" is created
 | 
					  # Clean up
 | 
				
			||||||
  # kube::test::get_object_assert cronjobs "{{range.items}}{{$id_field}}:{{end}}" 'pi:'
 | 
					  kubectl delete cronjob.v1beta1.batch pi "${kube_flags[@]}"
 | 
				
			||||||
  # # Clean up
 | 
					 | 
				
			||||||
  # kubectl delete cronjobs pi "${kube_flags[@]}"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  set +o nounset
 | 
					  set +o nounset
 | 
				
			||||||
  set +o errexit
 | 
					  set +o errexit
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,7 +34,7 @@ func TestSetDefaultCronJob(t *testing.T) {
 | 
				
			|||||||
		original *batchv1beta1.CronJob
 | 
							original *batchv1beta1.CronJob
 | 
				
			||||||
		expected *batchv1beta1.CronJob
 | 
							expected *batchv1beta1.CronJob
 | 
				
			||||||
	}{
 | 
						}{
 | 
				
			||||||
		"empty batchv2alpha1.CronJob should default batchv2alpha1.ConcurrencyPolicy and Suspend": {
 | 
							"empty batchv1beta1.CronJob should default batchv1beta1.ConcurrencyPolicy and Suspend": {
 | 
				
			||||||
			original: &batchv1beta1.CronJob{},
 | 
								original: &batchv1beta1.CronJob{},
 | 
				
			||||||
			expected: &batchv1beta1.CronJob{
 | 
								expected: &batchv1beta1.CronJob{
 | 
				
			||||||
				Spec: batchv1beta1.CronJobSpec{
 | 
									Spec: batchv1beta1.CronJobSpec{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/golang/glog:go_default_library",
 | 
					        "//vendor/github.com/golang/glog:go_default_library",
 | 
				
			||||||
        "//vendor/github.com/robfig/cron:go_default_library",
 | 
					        "//vendor/github.com/robfig/cron:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
 | 
					        "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
					        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
				
			||||||
@@ -50,7 +50,7 @@ go_test(
 | 
				
			|||||||
        "//pkg/api/install:go_default_library",
 | 
					        "//pkg/api/install:go_default_library",
 | 
				
			||||||
        "//pkg/apis/batch/install:go_default_library",
 | 
					        "//pkg/apis/batch/install:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
					        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
 | 
					        "//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,7 +36,7 @@ import (
 | 
				
			|||||||
	"github.com/golang/glog"
 | 
						"github.com/golang/glog"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/api/errors"
 | 
						"k8s.io/apimachinery/pkg/api/errors"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
@@ -56,7 +56,7 @@ import (
 | 
				
			|||||||
// Utilities for dealing with Jobs and CronJobs and time.
 | 
					// Utilities for dealing with Jobs and CronJobs and time.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// controllerKind contains the schema.GroupVersionKind for this controller type.
 | 
					// controllerKind contains the schema.GroupVersionKind for this controller type.
 | 
				
			||||||
var controllerKind = batchv2alpha1.SchemeGroupVersion.WithKind("CronJob")
 | 
					var controllerKind = batchv1beta1.SchemeGroupVersion.WithKind("CronJob")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type CronJobController struct {
 | 
					type CronJobController struct {
 | 
				
			||||||
	kubeClient clientset.Interface
 | 
						kubeClient clientset.Interface
 | 
				
			||||||
@@ -116,7 +116,7 @@ func (jm *CronJobController) syncAll() {
 | 
				
			|||||||
	js := jl.Items
 | 
						js := jl.Items
 | 
				
			||||||
	glog.V(4).Infof("Found %d jobs", len(js))
 | 
						glog.V(4).Infof("Found %d jobs", len(js))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sjl, err := jm.kubeClient.BatchV2alpha1().CronJobs(metav1.NamespaceAll).List(metav1.ListOptions{})
 | 
						sjl, err := jm.kubeClient.BatchV1beta1().CronJobs(metav1.NamespaceAll).List(metav1.ListOptions{})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		utilruntime.HandleError(fmt.Errorf("can't list CronJobs: %v", err))
 | 
							utilruntime.HandleError(fmt.Errorf("can't list CronJobs: %v", err))
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -134,7 +134,7 @@ func (jm *CronJobController) syncAll() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// cleanupFinishedJobs cleanups finished jobs created by a CronJob
 | 
					// cleanupFinishedJobs cleanups finished jobs created by a CronJob
 | 
				
			||||||
func cleanupFinishedJobs(sj *batchv2alpha1.CronJob, js []batchv1.Job, jc jobControlInterface,
 | 
					func cleanupFinishedJobs(sj *batchv1beta1.CronJob, js []batchv1.Job, jc jobControlInterface,
 | 
				
			||||||
	sjc sjControlInterface, pc podControlInterface, recorder record.EventRecorder) {
 | 
						sjc sjControlInterface, pc podControlInterface, recorder record.EventRecorder) {
 | 
				
			||||||
	// If neither limits are active, there is no need to do anything.
 | 
						// If neither limits are active, there is no need to do anything.
 | 
				
			||||||
	if sj.Spec.FailedJobsHistoryLimit == nil && sj.Spec.SuccessfulJobsHistoryLimit == nil {
 | 
						if sj.Spec.FailedJobsHistoryLimit == nil && sj.Spec.SuccessfulJobsHistoryLimit == nil {
 | 
				
			||||||
@@ -179,7 +179,7 @@ func cleanupFinishedJobs(sj *batchv2alpha1.CronJob, js []batchv1.Job, jc jobCont
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// removeOldestJobs removes the oldest jobs from a list of jobs
 | 
					// removeOldestJobs removes the oldest jobs from a list of jobs
 | 
				
			||||||
func removeOldestJobs(sj *batchv2alpha1.CronJob, js []batchv1.Job, jc jobControlInterface,
 | 
					func removeOldestJobs(sj *batchv1beta1.CronJob, js []batchv1.Job, jc jobControlInterface,
 | 
				
			||||||
	pc podControlInterface, maxJobs int32, recorder record.EventRecorder) {
 | 
						pc podControlInterface, maxJobs int32, recorder record.EventRecorder) {
 | 
				
			||||||
	numToDelete := len(js) - int(maxJobs)
 | 
						numToDelete := len(js) - int(maxJobs)
 | 
				
			||||||
	if numToDelete <= 0 {
 | 
						if numToDelete <= 0 {
 | 
				
			||||||
@@ -200,7 +200,7 @@ func removeOldestJobs(sj *batchv2alpha1.CronJob, js []batchv1.Job, jc jobControl
 | 
				
			|||||||
// All known jobs created by "sj" should be included in "js".
 | 
					// All known jobs created by "sj" should be included in "js".
 | 
				
			||||||
// The current time is passed in to facilitate testing.
 | 
					// The current time is passed in to facilitate testing.
 | 
				
			||||||
// It has no receiver, to facilitate testing.
 | 
					// It has no receiver, to facilitate testing.
 | 
				
			||||||
func syncOne(sj *batchv2alpha1.CronJob, js []batchv1.Job, now time.Time, jc jobControlInterface, sjc sjControlInterface, pc podControlInterface, recorder record.EventRecorder) {
 | 
					func syncOne(sj *batchv1beta1.CronJob, js []batchv1.Job, now time.Time, jc jobControlInterface, sjc sjControlInterface, pc podControlInterface, recorder record.EventRecorder) {
 | 
				
			||||||
	nameForLog := fmt.Sprintf("%s/%s", sj.Namespace, sj.Name)
 | 
						nameForLog := fmt.Sprintf("%s/%s", sj.Namespace, sj.Name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	childrenJobs := make(map[types.UID]bool)
 | 
						childrenJobs := make(map[types.UID]bool)
 | 
				
			||||||
@@ -284,7 +284,7 @@ func syncOne(sj *batchv2alpha1.CronJob, js []batchv1.Job, now time.Time, jc jobC
 | 
				
			|||||||
		// can see easily that there was a missed execution.
 | 
							// can see easily that there was a missed execution.
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if sj.Spec.ConcurrencyPolicy == batchv2alpha1.ForbidConcurrent && len(sj.Status.Active) > 0 {
 | 
						if sj.Spec.ConcurrencyPolicy == batchv1beta1.ForbidConcurrent && len(sj.Status.Active) > 0 {
 | 
				
			||||||
		// Regardless which source of information we use for the set of active jobs,
 | 
							// Regardless which source of information we use for the set of active jobs,
 | 
				
			||||||
		// there is some risk that we won't see an active job when there is one.
 | 
							// there is some risk that we won't see an active job when there is one.
 | 
				
			||||||
		// (because we haven't seen the status update to the SJ or the created pod).
 | 
							// (because we haven't seen the status update to the SJ or the created pod).
 | 
				
			||||||
@@ -297,7 +297,7 @@ func syncOne(sj *batchv2alpha1.CronJob, js []batchv1.Job, now time.Time, jc jobC
 | 
				
			|||||||
		glog.V(4).Infof("Not starting job for %s because of prior execution still running and concurrency policy is Forbid", nameForLog)
 | 
							glog.V(4).Infof("Not starting job for %s because of prior execution still running and concurrency policy is Forbid", nameForLog)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if sj.Spec.ConcurrencyPolicy == batchv2alpha1.ReplaceConcurrent {
 | 
						if sj.Spec.ConcurrencyPolicy == batchv1beta1.ReplaceConcurrent {
 | 
				
			||||||
		for _, j := range sj.Status.Active {
 | 
							for _, j := range sj.Status.Active {
 | 
				
			||||||
			// TODO: this should be replaced with server side job deletion
 | 
								// TODO: this should be replaced with server side job deletion
 | 
				
			||||||
			// currently this mimics JobReaper from pkg/kubectl/stop.go
 | 
								// currently this mimics JobReaper from pkg/kubectl/stop.go
 | 
				
			||||||
@@ -353,7 +353,7 @@ func syncOne(sj *batchv2alpha1.CronJob, js []batchv1.Job, now time.Time, jc jobC
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// deleteJob reaps a job, deleting the job, the pobs and the reference in the active list
 | 
					// deleteJob reaps a job, deleting the job, the pobs and the reference in the active list
 | 
				
			||||||
func deleteJob(sj *batchv2alpha1.CronJob, job *batchv1.Job, jc jobControlInterface,
 | 
					func deleteJob(sj *batchv1beta1.CronJob, job *batchv1.Job, jc jobControlInterface,
 | 
				
			||||||
	pc podControlInterface, recorder record.EventRecorder, reason string) bool {
 | 
						pc podControlInterface, recorder record.EventRecorder, reason string) bool {
 | 
				
			||||||
	// TODO: this should be replaced with server side job deletion
 | 
						// TODO: this should be replaced with server side job deletion
 | 
				
			||||||
	// currencontinuetly this mimics JobReaper from pkg/kubectl/stop.go
 | 
						// currencontinuetly this mimics JobReaper from pkg/kubectl/stop.go
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@ import (
 | 
				
			|||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchV1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/types"
 | 
						"k8s.io/apimachinery/pkg/types"
 | 
				
			||||||
@@ -96,19 +96,19 @@ func startTimeStringToTime(startTime string) time.Time {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// returns a cronJob with some fields filled in.
 | 
					// returns a cronJob with some fields filled in.
 | 
				
			||||||
func cronJob() batchv2alpha1.CronJob {
 | 
					func cronJob() batchV1beta1.CronJob {
 | 
				
			||||||
	return batchv2alpha1.CronJob{
 | 
						return batchV1beta1.CronJob{
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
			Name:              "mycronjob",
 | 
								Name:              "mycronjob",
 | 
				
			||||||
			Namespace:         "snazzycats",
 | 
								Namespace:         "snazzycats",
 | 
				
			||||||
			UID:               types.UID("1a2b3c"),
 | 
								UID:               types.UID("1a2b3c"),
 | 
				
			||||||
			SelfLink:          "/apis/batch/v2alpha1/namespaces/snazzycats/cronjobs/mycronjob",
 | 
								SelfLink:          "/apis/batch/v1beta1/namespaces/snazzycats/cronjobs/mycronjob",
 | 
				
			||||||
			CreationTimestamp: metav1.Time{Time: justBeforeTheHour()},
 | 
								CreationTimestamp: metav1.Time{Time: justBeforeTheHour()},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Spec: batchv2alpha1.CronJobSpec{
 | 
							Spec: batchV1beta1.CronJobSpec{
 | 
				
			||||||
			Schedule:          "* * * * ?",
 | 
								Schedule:          "* * * * ?",
 | 
				
			||||||
			ConcurrencyPolicy: batchv2alpha1.AllowConcurrent,
 | 
								ConcurrencyPolicy: batchV1beta1.AllowConcurrent,
 | 
				
			||||||
			JobTemplate: batchv2alpha1.JobTemplateSpec{
 | 
								JobTemplate: batchV1beta1.JobTemplateSpec{
 | 
				
			||||||
				ObjectMeta: metav1.ObjectMeta{
 | 
									ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
					Labels:      map[string]string{"a": "b"},
 | 
										Labels:      map[string]string{"a": "b"},
 | 
				
			||||||
					Annotations: map[string]string{"x": "y"},
 | 
										Annotations: map[string]string{"x": "y"},
 | 
				
			||||||
@@ -156,9 +156,9 @@ var (
 | 
				
			|||||||
	mediumDead int64                          = 2 * 60 * 60
 | 
						mediumDead int64                          = 2 * 60 * 60
 | 
				
			||||||
	longDead   int64                          = 1000000
 | 
						longDead   int64                          = 1000000
 | 
				
			||||||
	noDead     int64                          = -12345
 | 
						noDead     int64                          = -12345
 | 
				
			||||||
	A          batchv2alpha1.ConcurrencyPolicy = batchv2alpha1.AllowConcurrent
 | 
						A          batchV1beta1.ConcurrencyPolicy = batchV1beta1.AllowConcurrent
 | 
				
			||||||
	f          batchv2alpha1.ConcurrencyPolicy = batchv2alpha1.ForbidConcurrent
 | 
						f          batchV1beta1.ConcurrencyPolicy = batchV1beta1.ForbidConcurrent
 | 
				
			||||||
	R          batchv2alpha1.ConcurrencyPolicy = batchv2alpha1.ReplaceConcurrent
 | 
						R          batchV1beta1.ConcurrencyPolicy = batchV1beta1.ReplaceConcurrent
 | 
				
			||||||
	T          bool                           = true
 | 
						T          bool                           = true
 | 
				
			||||||
	F          bool                           = false
 | 
						F          bool                           = false
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -179,7 +179,7 @@ func TestSyncOne_RunOrNot(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	testCases := map[string]struct {
 | 
						testCases := map[string]struct {
 | 
				
			||||||
		// sj spec
 | 
							// sj spec
 | 
				
			||||||
		concurrencyPolicy batchv2alpha1.ConcurrencyPolicy
 | 
							concurrencyPolicy batchV1beta1.ConcurrencyPolicy
 | 
				
			||||||
		suspend           bool
 | 
							suspend           bool
 | 
				
			||||||
		schedule          string
 | 
							schedule          string
 | 
				
			||||||
		deadline          int64
 | 
							deadline          int64
 | 
				
			||||||
@@ -298,7 +298,7 @@ func TestSyncOne_RunOrNot(t *testing.T) {
 | 
				
			|||||||
			if controllerRef == nil {
 | 
								if controllerRef == nil {
 | 
				
			||||||
				t.Errorf("%s: expected job to have ControllerRef: %#v", name, job)
 | 
									t.Errorf("%s: expected job to have ControllerRef: %#v", name, job)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				if got, want := controllerRef.APIVersion, "batch/v2alpha1"; got != want {
 | 
									if got, want := controllerRef.APIVersion, "batch/v1beta1"; got != want {
 | 
				
			||||||
					t.Errorf("%s: controllerRef.APIVersion = %q, want %q", name, got, want)
 | 
										t.Errorf("%s: controllerRef.APIVersion = %q, want %q", name, got, want)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if got, want := controllerRef.Kind, "CronJob"; got != want {
 | 
									if got, want := controllerRef.Kind, "CronJob"; got != want {
 | 
				
			||||||
@@ -596,7 +596,7 @@ func TestSyncOne_Status(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	testCases := map[string]struct {
 | 
						testCases := map[string]struct {
 | 
				
			||||||
		// sj spec
 | 
							// sj spec
 | 
				
			||||||
		concurrencyPolicy batchv2alpha1.ConcurrencyPolicy
 | 
							concurrencyPolicy batchV1beta1.ConcurrencyPolicy
 | 
				
			||||||
		suspend           bool
 | 
							suspend           bool
 | 
				
			||||||
		schedule          string
 | 
							schedule          string
 | 
				
			||||||
		deadline          int64
 | 
							deadline          int64
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/labels"
 | 
						"k8s.io/apimachinery/pkg/labels"
 | 
				
			||||||
@@ -33,7 +33,7 @@ import (
 | 
				
			|||||||
// sjControlInterface is an interface that knows how to update CronJob status
 | 
					// sjControlInterface is an interface that knows how to update CronJob status
 | 
				
			||||||
// created as an interface to allow testing.
 | 
					// created as an interface to allow testing.
 | 
				
			||||||
type sjControlInterface interface {
 | 
					type sjControlInterface interface {
 | 
				
			||||||
	UpdateStatus(sj *batchv2alpha1.CronJob) (*batchv2alpha1.CronJob, error)
 | 
						UpdateStatus(sj *batchv1beta1.CronJob) (*batchv1beta1.CronJob, error)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// realSJControl is the default implementation of sjControlInterface.
 | 
					// realSJControl is the default implementation of sjControlInterface.
 | 
				
			||||||
@@ -43,18 +43,18 @@ type realSJControl struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var _ sjControlInterface = &realSJControl{}
 | 
					var _ sjControlInterface = &realSJControl{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *realSJControl) UpdateStatus(sj *batchv2alpha1.CronJob) (*batchv2alpha1.CronJob, error) {
 | 
					func (c *realSJControl) UpdateStatus(sj *batchv1beta1.CronJob) (*batchv1beta1.CronJob, error) {
 | 
				
			||||||
	return c.KubeClient.BatchV2alpha1().CronJobs(sj.Namespace).UpdateStatus(sj)
 | 
						return c.KubeClient.BatchV1beta1().CronJobs(sj.Namespace).UpdateStatus(sj)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// fakeSJControl is the default implementation of sjControlInterface.
 | 
					// fakeSJControl is the default implementation of sjControlInterface.
 | 
				
			||||||
type fakeSJControl struct {
 | 
					type fakeSJControl struct {
 | 
				
			||||||
	Updates []batchv2alpha1.CronJob
 | 
						Updates []batchv1beta1.CronJob
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ sjControlInterface = &fakeSJControl{}
 | 
					var _ sjControlInterface = &fakeSJControl{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *fakeSJControl) UpdateStatus(sj *batchv2alpha1.CronJob) (*batchv2alpha1.CronJob, error) {
 | 
					func (c *fakeSJControl) UpdateStatus(sj *batchv1beta1.CronJob) (*batchv1beta1.CronJob, error) {
 | 
				
			||||||
	c.Updates = append(c.Updates, *sj)
 | 
						c.Updates = append(c.Updates, *sj)
 | 
				
			||||||
	return sj, nil
 | 
						return sj, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -85,7 +85,7 @@ type realJobControl struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var _ jobControlInterface = &realJobControl{}
 | 
					var _ jobControlInterface = &realJobControl{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func copyLabels(template *batchv2alpha1.JobTemplateSpec) labels.Set {
 | 
					func copyLabels(template *batchv1beta1.JobTemplateSpec) labels.Set {
 | 
				
			||||||
	l := make(labels.Set)
 | 
						l := make(labels.Set)
 | 
				
			||||||
	for k, v := range template.Labels {
 | 
						for k, v := range template.Labels {
 | 
				
			||||||
		l[k] = v
 | 
							l[k] = v
 | 
				
			||||||
@@ -93,7 +93,7 @@ func copyLabels(template *batchv2alpha1.JobTemplateSpec) labels.Set {
 | 
				
			|||||||
	return l
 | 
						return l
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func copyAnnotations(template *batchv2alpha1.JobTemplateSpec) labels.Set {
 | 
					func copyAnnotations(template *batchv1beta1.JobTemplateSpec) labels.Set {
 | 
				
			||||||
	a := make(labels.Set)
 | 
						a := make(labels.Set)
 | 
				
			||||||
	for k, v := range template.Annotations {
 | 
						for k, v := range template.Annotations {
 | 
				
			||||||
		a[k] = v
 | 
							a[k] = v
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@ import (
 | 
				
			|||||||
	"github.com/robfig/cron"
 | 
						"github.com/robfig/cron"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
						"k8s.io/apimachinery/pkg/runtime"
 | 
				
			||||||
@@ -36,7 +36,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Utilities for dealing with Jobs and CronJobs and time.
 | 
					// Utilities for dealing with Jobs and CronJobs and time.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func inActiveList(sj batchv2alpha1.CronJob, uid types.UID) bool {
 | 
					func inActiveList(sj batchv1beta1.CronJob, uid types.UID) bool {
 | 
				
			||||||
	for _, j := range sj.Status.Active {
 | 
						for _, j := range sj.Status.Active {
 | 
				
			||||||
		if j.UID == uid {
 | 
							if j.UID == uid {
 | 
				
			||||||
			return true
 | 
								return true
 | 
				
			||||||
@@ -45,7 +45,7 @@ func inActiveList(sj batchv2alpha1.CronJob, uid types.UID) bool {
 | 
				
			|||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func deleteFromActiveList(sj *batchv2alpha1.CronJob, uid types.UID) {
 | 
					func deleteFromActiveList(sj *batchv1beta1.CronJob, uid types.UID) {
 | 
				
			||||||
	if sj == nil {
 | 
						if sj == nil {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -111,7 +111,7 @@ func getNextStartTimeAfter(schedule string, now time.Time) (time.Time, error) {
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// If there are too many (>100) unstarted times, just give up and return an empty slice.
 | 
					// If there are too many (>100) unstarted times, just give up and return an empty slice.
 | 
				
			||||||
// If there were missed times prior to the last known start time, then those are not returned.
 | 
					// If there were missed times prior to the last known start time, then those are not returned.
 | 
				
			||||||
func getRecentUnmetScheduleTimes(sj batchv2alpha1.CronJob, now time.Time) ([]time.Time, error) {
 | 
					func getRecentUnmetScheduleTimes(sj batchv1beta1.CronJob, now time.Time) ([]time.Time, error) {
 | 
				
			||||||
	starts := []time.Time{}
 | 
						starts := []time.Time{}
 | 
				
			||||||
	sched, err := cron.ParseStandard(sj.Spec.Schedule)
 | 
						sched, err := cron.ParseStandard(sj.Spec.Schedule)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -170,7 +170,7 @@ func getRecentUnmetScheduleTimes(sj batchv2alpha1.CronJob, now time.Time) ([]tim
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// getJobFromTemplate makes a Job from a CronJob
 | 
					// getJobFromTemplate makes a Job from a CronJob
 | 
				
			||||||
func getJobFromTemplate(sj *batchv2alpha1.CronJob, scheduledTime time.Time) (*batchv1.Job, error) {
 | 
					func getJobFromTemplate(sj *batchv1beta1.CronJob, scheduledTime time.Time) (*batchv1.Job, error) {
 | 
				
			||||||
	// TODO: consider adding the following labels:
 | 
						// TODO: consider adding the following labels:
 | 
				
			||||||
	// nominal-start-time=$RFC_3339_DATE_OF_INTENDED_START -- for user convenience
 | 
						// nominal-start-time=$RFC_3339_DATE_OF_INTENDED_START -- for user convenience
 | 
				
			||||||
	// scheduled-job-name=$SJ_NAME -- for user convenience
 | 
						// scheduled-job-name=$SJ_NAME -- for user convenience
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ import (
 | 
				
			|||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/types"
 | 
						"k8s.io/apimachinery/pkg/types"
 | 
				
			||||||
@@ -37,17 +37,17 @@ func TestGetJobFromTemplate(t *testing.T) {
 | 
				
			|||||||
	var one int64 = 1
 | 
						var one int64 = 1
 | 
				
			||||||
	var no bool = false
 | 
						var no bool = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sj := batchv2alpha1.CronJob{
 | 
						sj := batchv1beta1.CronJob{
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
			Name:      "mycronjob",
 | 
								Name:      "mycronjob",
 | 
				
			||||||
			Namespace: "snazzycats",
 | 
								Namespace: "snazzycats",
 | 
				
			||||||
			UID:       types.UID("1a2b3c"),
 | 
								UID:       types.UID("1a2b3c"),
 | 
				
			||||||
			SelfLink:  "/apis/batch/v1/namespaces/snazzycats/jobs/mycronjob",
 | 
								SelfLink:  "/apis/batch/v1/namespaces/snazzycats/jobs/mycronjob",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Spec: batchv2alpha1.CronJobSpec{
 | 
							Spec: batchv1beta1.CronJobSpec{
 | 
				
			||||||
			Schedule:          "* * * * ?",
 | 
								Schedule:          "* * * * ?",
 | 
				
			||||||
			ConcurrencyPolicy: batchv2alpha1.AllowConcurrent,
 | 
								ConcurrencyPolicy: batchv1beta1.AllowConcurrent,
 | 
				
			||||||
			JobTemplate: batchv2alpha1.JobTemplateSpec{
 | 
								JobTemplate: batchv1beta1.JobTemplateSpec{
 | 
				
			||||||
				ObjectMeta: metav1.ObjectMeta{
 | 
									ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
					Labels:      map[string]string{"a": "b"},
 | 
										Labels:      map[string]string{"a": "b"},
 | 
				
			||||||
					Annotations: map[string]string{"x": "y"},
 | 
										Annotations: map[string]string{"x": "y"},
 | 
				
			||||||
@@ -267,16 +267,16 @@ func TestGetRecentUnmetScheduleTimes(t *testing.T) {
 | 
				
			|||||||
		t.Errorf("test setup error: %v", err)
 | 
							t.Errorf("test setup error: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sj := batchv2alpha1.CronJob{
 | 
						sj := batchv1beta1.CronJob{
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
			Name:      "mycronjob",
 | 
								Name:      "mycronjob",
 | 
				
			||||||
			Namespace: metav1.NamespaceDefault,
 | 
								Namespace: metav1.NamespaceDefault,
 | 
				
			||||||
			UID:       types.UID("1a2b3c"),
 | 
								UID:       types.UID("1a2b3c"),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Spec: batchv2alpha1.CronJobSpec{
 | 
							Spec: batchv1beta1.CronJobSpec{
 | 
				
			||||||
			Schedule:          schedule,
 | 
								Schedule:          schedule,
 | 
				
			||||||
			ConcurrencyPolicy: batchv2alpha1.AllowConcurrent,
 | 
								ConcurrencyPolicy: batchv1beta1.AllowConcurrent,
 | 
				
			||||||
			JobTemplate:       batchv2alpha1.JobTemplateSpec{},
 | 
								JobTemplate:       batchv1beta1.JobTemplateSpec{},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,6 +51,7 @@ go_test(
 | 
				
			|||||||
        "//vendor/github.com/spf13/cobra:go_default_library",
 | 
					        "//vendor/github.com/spf13/cobra:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/api/batch/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
				
			||||||
@@ -142,6 +143,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/spf13/pflag:go_default_library",
 | 
					        "//vendor/github.com/spf13/pflag:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/api/batch/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -108,6 +108,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/spf13/pflag:go_default_library",
 | 
					        "//vendor/github.com/spf13/pflag:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/api/batch/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,7 @@ import (
 | 
				
			|||||||
	"github.com/spf13/cobra"
 | 
						"github.com/spf13/cobra"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
				
			||||||
	extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
						extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/api/errors"
 | 
						"k8s.io/apimachinery/pkg/api/errors"
 | 
				
			||||||
@@ -225,8 +226,12 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c
 | 
				
			|||||||
	generatorName := cmdutil.GetFlagString(cmd, "generator")
 | 
						generatorName := cmdutil.GetFlagString(cmd, "generator")
 | 
				
			||||||
	schedule := cmdutil.GetFlagString(cmd, "schedule")
 | 
						schedule := cmdutil.GetFlagString(cmd, "schedule")
 | 
				
			||||||
	if len(schedule) != 0 && len(generatorName) == 0 {
 | 
						if len(schedule) != 0 && len(generatorName) == 0 {
 | 
				
			||||||
 | 
							if contains(resourcesList, batchv1beta1.SchemeGroupVersion.WithResource("cronjobs")) {
 | 
				
			||||||
 | 
								generatorName = cmdutil.CronJobV1Beta1GeneratorName
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
			generatorName = cmdutil.CronJobV2Alpha1GeneratorName
 | 
								generatorName = cmdutil.CronJobV2Alpha1GeneratorName
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if len(generatorName) == 0 {
 | 
						if len(generatorName) == 0 {
 | 
				
			||||||
		switch restartPolicy {
 | 
							switch restartPolicy {
 | 
				
			||||||
		case api.RestartPolicyAlways:
 | 
							case api.RestartPolicyAlways:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -479,6 +479,7 @@ const (
 | 
				
			|||||||
	DeploymentBasicAppsV1Beta1GeneratorName = "deployment-basic/apps.v1beta1"
 | 
						DeploymentBasicAppsV1Beta1GeneratorName = "deployment-basic/apps.v1beta1"
 | 
				
			||||||
	JobV1GeneratorName                      = "job/v1"
 | 
						JobV1GeneratorName                      = "job/v1"
 | 
				
			||||||
	CronJobV2Alpha1GeneratorName            = "cronjob/v2alpha1"
 | 
						CronJobV2Alpha1GeneratorName            = "cronjob/v2alpha1"
 | 
				
			||||||
 | 
						CronJobV1Beta1GeneratorName             = "cronjob/v1beta1"
 | 
				
			||||||
	NamespaceV1GeneratorName                = "namespace/v1"
 | 
						NamespaceV1GeneratorName                = "namespace/v1"
 | 
				
			||||||
	ResourceQuotaV1GeneratorName            = "resourcequotas/v1"
 | 
						ResourceQuotaV1GeneratorName            = "resourcequotas/v1"
 | 
				
			||||||
	SecretV1GeneratorName                   = "secret/v1"
 | 
						SecretV1GeneratorName                   = "secret/v1"
 | 
				
			||||||
@@ -528,6 +529,7 @@ func DefaultGenerators(cmdName string) map[string]kubectl.Generator {
 | 
				
			|||||||
			DeploymentAppsV1Beta1GeneratorName: kubectl.DeploymentAppsV1Beta1{},
 | 
								DeploymentAppsV1Beta1GeneratorName: kubectl.DeploymentAppsV1Beta1{},
 | 
				
			||||||
			JobV1GeneratorName:                 kubectl.JobV1{},
 | 
								JobV1GeneratorName:                 kubectl.JobV1{},
 | 
				
			||||||
			CronJobV2Alpha1GeneratorName:       kubectl.CronJobV2Alpha1{},
 | 
								CronJobV2Alpha1GeneratorName:       kubectl.CronJobV2Alpha1{},
 | 
				
			||||||
 | 
								CronJobV1Beta1GeneratorName:        kubectl.CronJobV1Beta1{},
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	case "autoscale":
 | 
						case "autoscale":
 | 
				
			||||||
		generator = map[string]kubectl.Generator{
 | 
							generator = map[string]kubectl.Generator{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	appsv1beta1 "k8s.io/api/apps/v1beta1"
 | 
						appsv1beta1 "k8s.io/api/apps/v1beta1"
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
						extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
				
			||||||
@@ -483,6 +484,107 @@ func (CronJobV2Alpha1) Generate(genericParams map[string]interface{}) (runtime.O
 | 
				
			|||||||
	return &cronJob, nil
 | 
						return &cronJob, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type CronJobV1Beta1 struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (CronJobV1Beta1) ParamNames() []GeneratorParam {
 | 
				
			||||||
 | 
						return []GeneratorParam{
 | 
				
			||||||
 | 
							{"labels", false},
 | 
				
			||||||
 | 
							{"default-name", false},
 | 
				
			||||||
 | 
							{"name", true},
 | 
				
			||||||
 | 
							{"image", true},
 | 
				
			||||||
 | 
							{"image-pull-policy", false},
 | 
				
			||||||
 | 
							{"port", false},
 | 
				
			||||||
 | 
							{"hostport", false},
 | 
				
			||||||
 | 
							{"stdin", false},
 | 
				
			||||||
 | 
							{"leave-stdin-open", false},
 | 
				
			||||||
 | 
							{"tty", false},
 | 
				
			||||||
 | 
							{"command", false},
 | 
				
			||||||
 | 
							{"args", false},
 | 
				
			||||||
 | 
							{"env", false},
 | 
				
			||||||
 | 
							{"requests", false},
 | 
				
			||||||
 | 
							{"limits", false},
 | 
				
			||||||
 | 
							{"restart", false},
 | 
				
			||||||
 | 
							{"schedule", true},
 | 
				
			||||||
 | 
							{"serviceaccount", false},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (CronJobV1Beta1) Generate(genericParams map[string]interface{}) (runtime.Object, error) {
 | 
				
			||||||
 | 
						args, err := getArgs(genericParams)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						envs, err := getEnvs(genericParams)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params, err := getParams(genericParams)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						name, err := getName(params)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						labels, err := getLabels(params, name)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						podSpec, err := makePodSpec(params, name)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						imagePullPolicy := v1.PullPolicy(params["image-pull-policy"])
 | 
				
			||||||
 | 
						if err = updatePodContainers(params, args, envs, imagePullPolicy, podSpec); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						leaveStdinOpen, err := GetBool(params, "leave-stdin-open", false)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						podSpec.Containers[0].StdinOnce = !leaveStdinOpen && podSpec.Containers[0].Stdin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := updatePodPorts(params, podSpec); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						restartPolicy := v1.RestartPolicy(params["restart"])
 | 
				
			||||||
 | 
						if len(restartPolicy) == 0 {
 | 
				
			||||||
 | 
							restartPolicy = v1.RestartPolicyNever
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						podSpec.RestartPolicy = restartPolicy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cronJob := batchv1beta1.CronJob{
 | 
				
			||||||
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
								Name:   name,
 | 
				
			||||||
 | 
								Labels: labels,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Spec: batchv1beta1.CronJobSpec{
 | 
				
			||||||
 | 
								Schedule:          params["schedule"],
 | 
				
			||||||
 | 
								ConcurrencyPolicy: batchv1beta1.AllowConcurrent,
 | 
				
			||||||
 | 
								JobTemplate: batchv1beta1.JobTemplateSpec{
 | 
				
			||||||
 | 
									Spec: batchv1.JobSpec{
 | 
				
			||||||
 | 
										Template: v1.PodTemplateSpec{
 | 
				
			||||||
 | 
											ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
												Labels: labels,
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
 | 
											Spec: *podSpec,
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &cronJob, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type BasicReplicationController struct{}
 | 
					type BasicReplicationController struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (BasicReplicationController) ParamNames() []GeneratorParam {
 | 
					func (BasicReplicationController) ParamNames() []GeneratorParam {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,6 +22,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	appsv1beta1 "k8s.io/api/apps/v1beta1"
 | 
						appsv1beta1 "k8s.io/api/apps/v1beta1"
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
						extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
				
			||||||
@@ -922,7 +923,7 @@ func TestGenerateJob(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestGenerateCronJob(t *testing.T) {
 | 
					func TestGenerateCronJobAlpha(t *testing.T) {
 | 
				
			||||||
	tests := []struct {
 | 
						tests := []struct {
 | 
				
			||||||
		params    map[string]interface{}
 | 
							params    map[string]interface{}
 | 
				
			||||||
		expected  *batchv2alpha1.CronJob
 | 
							expected  *batchv2alpha1.CronJob
 | 
				
			||||||
@@ -1020,6 +1021,104 @@ func TestGenerateCronJob(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGenerateCronJobBeta(t *testing.T) {
 | 
				
			||||||
 | 
						tests := []struct {
 | 
				
			||||||
 | 
							params    map[string]interface{}
 | 
				
			||||||
 | 
							expected  *batchv1beta1.CronJob
 | 
				
			||||||
 | 
							expectErr bool
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								params: map[string]interface{}{
 | 
				
			||||||
 | 
									"labels":           "foo=bar,baz=blah",
 | 
				
			||||||
 | 
									"name":             "foo",
 | 
				
			||||||
 | 
									"image":            "someimage",
 | 
				
			||||||
 | 
									"port":             "80",
 | 
				
			||||||
 | 
									"hostport":         "80",
 | 
				
			||||||
 | 
									"stdin":            "true",
 | 
				
			||||||
 | 
									"leave-stdin-open": "true",
 | 
				
			||||||
 | 
									"command":          "true",
 | 
				
			||||||
 | 
									"args":             []string{"bar", "baz", "blah"},
 | 
				
			||||||
 | 
									"env":              []string{"a=b", "c=d"},
 | 
				
			||||||
 | 
									"requests":         "cpu=100m,memory=100Mi",
 | 
				
			||||||
 | 
									"limits":           "cpu=400m,memory=200Mi",
 | 
				
			||||||
 | 
									"restart":          "OnFailure",
 | 
				
			||||||
 | 
									"schedule":         "0/5 * * * ?",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								expected: &batchv1beta1.CronJob{
 | 
				
			||||||
 | 
									ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
										Name:   "foo",
 | 
				
			||||||
 | 
										Labels: map[string]string{"foo": "bar", "baz": "blah"},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Spec: batchv1beta1.CronJobSpec{
 | 
				
			||||||
 | 
										Schedule:          "0/5 * * * ?",
 | 
				
			||||||
 | 
										ConcurrencyPolicy: batchv1beta1.AllowConcurrent,
 | 
				
			||||||
 | 
										JobTemplate: batchv1beta1.JobTemplateSpec{
 | 
				
			||||||
 | 
											Spec: batchv1.JobSpec{
 | 
				
			||||||
 | 
												Template: v1.PodTemplateSpec{
 | 
				
			||||||
 | 
													ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
 | 
														Labels: map[string]string{"foo": "bar", "baz": "blah"},
 | 
				
			||||||
 | 
													},
 | 
				
			||||||
 | 
													Spec: v1.PodSpec{
 | 
				
			||||||
 | 
														RestartPolicy: v1.RestartPolicyOnFailure,
 | 
				
			||||||
 | 
														Containers: []v1.Container{
 | 
				
			||||||
 | 
															{
 | 
				
			||||||
 | 
																Name:      "foo",
 | 
				
			||||||
 | 
																Image:     "someimage",
 | 
				
			||||||
 | 
																Stdin:     true,
 | 
				
			||||||
 | 
																StdinOnce: false,
 | 
				
			||||||
 | 
																Ports: []v1.ContainerPort{
 | 
				
			||||||
 | 
																	{
 | 
				
			||||||
 | 
																		ContainerPort: 80,
 | 
				
			||||||
 | 
																		HostPort:      80,
 | 
				
			||||||
 | 
																	},
 | 
				
			||||||
 | 
																},
 | 
				
			||||||
 | 
																Command: []string{"bar", "baz", "blah"},
 | 
				
			||||||
 | 
																Env: []v1.EnvVar{
 | 
				
			||||||
 | 
																	{
 | 
				
			||||||
 | 
																		Name:  "a",
 | 
				
			||||||
 | 
																		Value: "b",
 | 
				
			||||||
 | 
																	},
 | 
				
			||||||
 | 
																	{
 | 
				
			||||||
 | 
																		Name:  "c",
 | 
				
			||||||
 | 
																		Value: "d",
 | 
				
			||||||
 | 
																	},
 | 
				
			||||||
 | 
																},
 | 
				
			||||||
 | 
																Resources: v1.ResourceRequirements{
 | 
				
			||||||
 | 
																	Requests: v1.ResourceList{
 | 
				
			||||||
 | 
																		v1.ResourceCPU:    resource.MustParse("100m"),
 | 
				
			||||||
 | 
																		v1.ResourceMemory: resource.MustParse("100Mi"),
 | 
				
			||||||
 | 
																	},
 | 
				
			||||||
 | 
																	Limits: v1.ResourceList{
 | 
				
			||||||
 | 
																		v1.ResourceCPU:    resource.MustParse("400m"),
 | 
				
			||||||
 | 
																		v1.ResourceMemory: resource.MustParse("200Mi"),
 | 
				
			||||||
 | 
																	},
 | 
				
			||||||
 | 
																},
 | 
				
			||||||
 | 
															},
 | 
				
			||||||
 | 
														},
 | 
				
			||||||
 | 
													},
 | 
				
			||||||
 | 
												},
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						generator := CronJobV1Beta1{}
 | 
				
			||||||
 | 
						for _, test := range tests {
 | 
				
			||||||
 | 
							obj, err := generator.Generate(test.params)
 | 
				
			||||||
 | 
							if !test.expectErr && err != nil {
 | 
				
			||||||
 | 
								t.Errorf("unexpected error: %v", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if test.expectErr && err != nil {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !reflect.DeepEqual(obj.(*batchv1beta1.CronJob), test.expected) {
 | 
				
			||||||
 | 
								t.Errorf("\nexpected:\n%#v\nsaw:\n%#v", test.expected, obj.(*batchv1beta1.CronJob))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestParseEnv(t *testing.T) {
 | 
					func TestParseEnv(t *testing.T) {
 | 
				
			||||||
	tests := []struct {
 | 
						tests := []struct {
 | 
				
			||||||
		envArray  []string
 | 
							envArray  []string
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -73,6 +73,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/k8s.io/api/authorization/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/authorization/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/autoscaling/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/autoscaling/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
 | 
					        "//vendor/k8s.io/api/batch/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/certificates/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/certificates/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
				
			||||||
@@ -134,7 +135,7 @@ go_test(
 | 
				
			|||||||
        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/autoscaling/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/autoscaling/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/certificates/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/certificates/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,6 +32,7 @@ import (
 | 
				
			|||||||
	authorizationapiv1beta1 "k8s.io/api/authorization/v1beta1"
 | 
						authorizationapiv1beta1 "k8s.io/api/authorization/v1beta1"
 | 
				
			||||||
	autoscalingapiv1 "k8s.io/api/autoscaling/v1"
 | 
						autoscalingapiv1 "k8s.io/api/autoscaling/v1"
 | 
				
			||||||
	batchapiv1 "k8s.io/api/batch/v1"
 | 
						batchapiv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
 | 
						batchapiv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	certificatesapiv1beta1 "k8s.io/api/certificates/v1beta1"
 | 
						certificatesapiv1beta1 "k8s.io/api/certificates/v1beta1"
 | 
				
			||||||
	apiv1 "k8s.io/api/core/v1"
 | 
						apiv1 "k8s.io/api/core/v1"
 | 
				
			||||||
	extensionsapiv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
						extensionsapiv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
				
			||||||
@@ -381,9 +382,7 @@ func DefaultAPIResourceConfigSource() *serverstorage.ResourceConfig {
 | 
				
			|||||||
		apiv1.SchemeGroupVersion,
 | 
							apiv1.SchemeGroupVersion,
 | 
				
			||||||
		extensionsapiv1beta1.SchemeGroupVersion,
 | 
							extensionsapiv1beta1.SchemeGroupVersion,
 | 
				
			||||||
		batchapiv1.SchemeGroupVersion,
 | 
							batchapiv1.SchemeGroupVersion,
 | 
				
			||||||
		// TODO: enable batch/v1beta1 by default before 1.8 release, after issues
 | 
							batchapiv1beta1.SchemeGroupVersion,
 | 
				
			||||||
		// with CronJobs existing in multiple versions at once is solved
 | 
					 | 
				
			||||||
		// batchapiv1beta1.SchemeGroupVersion,
 | 
					 | 
				
			||||||
		authenticationv1.SchemeGroupVersion,
 | 
							authenticationv1.SchemeGroupVersion,
 | 
				
			||||||
		authenticationv1beta1.SchemeGroupVersion,
 | 
							authenticationv1beta1.SchemeGroupVersion,
 | 
				
			||||||
		autoscalingapiv1.SchemeGroupVersion,
 | 
							autoscalingapiv1.SchemeGroupVersion,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ import (
 | 
				
			|||||||
	appsapiv1beta1 "k8s.io/api/apps/v1beta1"
 | 
						appsapiv1beta1 "k8s.io/api/apps/v1beta1"
 | 
				
			||||||
	autoscalingapiv1 "k8s.io/api/autoscaling/v1"
 | 
						autoscalingapiv1 "k8s.io/api/autoscaling/v1"
 | 
				
			||||||
	batchapiv1 "k8s.io/api/batch/v1"
 | 
						batchapiv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
	batchapiv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchapiv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	certificatesapiv1beta1 "k8s.io/api/certificates/v1beta1"
 | 
						certificatesapiv1beta1 "k8s.io/api/certificates/v1beta1"
 | 
				
			||||||
	apiv1 "k8s.io/api/core/v1"
 | 
						apiv1 "k8s.io/api/core/v1"
 | 
				
			||||||
	extensionsapiv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
						extensionsapiv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
				
			||||||
@@ -80,6 +80,8 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion
 | 
				
			|||||||
	resourceEncoding.SetVersionEncoding(api.GroupName, api.Registry.GroupOrDie(api.GroupName).GroupVersion, schema.GroupVersion{Group: api.GroupName, Version: runtime.APIVersionInternal})
 | 
						resourceEncoding.SetVersionEncoding(api.GroupName, api.Registry.GroupOrDie(api.GroupName).GroupVersion, schema.GroupVersion{Group: api.GroupName, Version: runtime.APIVersionInternal})
 | 
				
			||||||
	resourceEncoding.SetVersionEncoding(autoscaling.GroupName, *testapi.Autoscaling.GroupVersion(), schema.GroupVersion{Group: autoscaling.GroupName, Version: runtime.APIVersionInternal})
 | 
						resourceEncoding.SetVersionEncoding(autoscaling.GroupName, *testapi.Autoscaling.GroupVersion(), schema.GroupVersion{Group: autoscaling.GroupName, Version: runtime.APIVersionInternal})
 | 
				
			||||||
	resourceEncoding.SetVersionEncoding(batch.GroupName, *testapi.Batch.GroupVersion(), schema.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal})
 | 
						resourceEncoding.SetVersionEncoding(batch.GroupName, *testapi.Batch.GroupVersion(), schema.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal})
 | 
				
			||||||
 | 
						// FIXME (soltysh): this GroupVersionResource override should be configurable
 | 
				
			||||||
 | 
						resourceEncoding.SetResourceEncoding(schema.GroupResource{Group: "batch", Resource: "cronjobs"}, schema.GroupVersion{Group: batch.GroupName, Version: "v1beta1"}, schema.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal})
 | 
				
			||||||
	resourceEncoding.SetVersionEncoding(apps.GroupName, *testapi.Apps.GroupVersion(), schema.GroupVersion{Group: apps.GroupName, Version: runtime.APIVersionInternal})
 | 
						resourceEncoding.SetVersionEncoding(apps.GroupName, *testapi.Apps.GroupVersion(), schema.GroupVersion{Group: apps.GroupName, Version: runtime.APIVersionInternal})
 | 
				
			||||||
	resourceEncoding.SetVersionEncoding(extensions.GroupName, *testapi.Extensions.GroupVersion(), schema.GroupVersion{Group: extensions.GroupName, Version: runtime.APIVersionInternal})
 | 
						resourceEncoding.SetVersionEncoding(extensions.GroupName, *testapi.Extensions.GroupVersion(), schema.GroupVersion{Group: extensions.GroupName, Version: runtime.APIVersionInternal})
 | 
				
			||||||
	resourceEncoding.SetVersionEncoding(rbac.GroupName, *testapi.Rbac.GroupVersion(), schema.GroupVersion{Group: rbac.GroupName, Version: runtime.APIVersionInternal})
 | 
						resourceEncoding.SetVersionEncoding(rbac.GroupName, *testapi.Rbac.GroupVersion(), schema.GroupVersion{Group: rbac.GroupName, Version: runtime.APIVersionInternal})
 | 
				
			||||||
@@ -193,7 +195,7 @@ func limitedAPIResourceConfigSource() *serverstorage.ResourceConfig {
 | 
				
			|||||||
		apiv1.SchemeGroupVersion,
 | 
							apiv1.SchemeGroupVersion,
 | 
				
			||||||
		extensionsapiv1beta1.SchemeGroupVersion,
 | 
							extensionsapiv1beta1.SchemeGroupVersion,
 | 
				
			||||||
		batchapiv1.SchemeGroupVersion,
 | 
							batchapiv1.SchemeGroupVersion,
 | 
				
			||||||
		batchapiv2alpha1.SchemeGroupVersion,
 | 
							batchapiv1beta1.SchemeGroupVersion,
 | 
				
			||||||
		appsapiv1beta1.SchemeGroupVersion,
 | 
							appsapiv1beta1.SchemeGroupVersion,
 | 
				
			||||||
		autoscalingapiv1.SchemeGroupVersion,
 | 
							autoscalingapiv1.SchemeGroupVersion,
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,7 +88,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/autoscaling/v2alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/autoscaling/v2alpha1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/certificates/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/certificates/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ import (
 | 
				
			|||||||
	appsv1beta1 "k8s.io/api/apps/v1beta1"
 | 
						appsv1beta1 "k8s.io/api/apps/v1beta1"
 | 
				
			||||||
	autoscalingv2alpha1 "k8s.io/api/autoscaling/v2alpha1"
 | 
						autoscalingv2alpha1 "k8s.io/api/autoscaling/v2alpha1"
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
 | 
						certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
 | 
				
			||||||
	apiv1 "k8s.io/api/core/v1"
 | 
						apiv1 "k8s.io/api/core/v1"
 | 
				
			||||||
	extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
						extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
 | 
				
			||||||
@@ -160,10 +160,10 @@ func AddHandlers(h printers.PrintHandler) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	cronJobColumnDefinitions := []metav1alpha1.TableColumnDefinition{
 | 
						cronJobColumnDefinitions := []metav1alpha1.TableColumnDefinition{
 | 
				
			||||||
		{Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
 | 
							{Name: "Name", Type: "string", Format: "name", Description: metav1.ObjectMeta{}.SwaggerDoc()["name"]},
 | 
				
			||||||
		{Name: "Schedule", Type: "string", Description: batchv2alpha1.CronJobSpec{}.SwaggerDoc()["schedule"]},
 | 
							{Name: "Schedule", Type: "string", Description: batchv1beta1.CronJobSpec{}.SwaggerDoc()["schedule"]},
 | 
				
			||||||
		{Name: "Suspend", Type: "boolean", Description: batchv2alpha1.CronJobSpec{}.SwaggerDoc()["suspend"]},
 | 
							{Name: "Suspend", Type: "boolean", Description: batchv1beta1.CronJobSpec{}.SwaggerDoc()["suspend"]},
 | 
				
			||||||
		{Name: "Active", Type: "integer", Description: batchv2alpha1.CronJobStatus{}.SwaggerDoc()["active"]},
 | 
							{Name: "Active", Type: "integer", Description: batchv1beta1.CronJobStatus{}.SwaggerDoc()["active"]},
 | 
				
			||||||
		{Name: "Last Schedule", Type: "string", Description: batchv2alpha1.CronJobStatus{}.SwaggerDoc()["lastScheduleTime"]},
 | 
							{Name: "Last Schedule", Type: "string", Description: batchv1beta1.CronJobStatus{}.SwaggerDoc()["lastScheduleTime"]},
 | 
				
			||||||
		{Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
 | 
							{Name: "Age", Type: "string", Description: metav1.ObjectMeta{}.SwaggerDoc()["creationTimestamp"]},
 | 
				
			||||||
		{Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."},
 | 
							{Name: "Containers", Type: "string", Priority: 1, Description: "Names of each container in the template."},
 | 
				
			||||||
		{Name: "Images", Type: "string", Priority: 1, Description: "Images referenced by each container in the template."},
 | 
							{Name: "Images", Type: "string", Priority: 1, Description: "Images referenced by each container in the template."},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/github.com/onsi/gomega:go_default_library",
 | 
					        "//vendor/github.com/onsi/gomega:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/rbac/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/rbac/v1beta1:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ import (
 | 
				
			|||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	"k8s.io/api/extensions/v1beta1"
 | 
						"k8s.io/api/extensions/v1beta1"
 | 
				
			||||||
	apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
 | 
						apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
 | 
				
			||||||
@@ -66,7 +66,7 @@ func getNonOrphanOptions() *metav1.DeleteOptions {
 | 
				
			|||||||
var (
 | 
					var (
 | 
				
			||||||
	zero = int64(0)
 | 
						zero = int64(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CronJobGroupVersionResource = schema.GroupVersionResource{Group: batchv2alpha1.GroupName, Version: "v2alpha1", Resource: "cronjobs"}
 | 
						CronJobGroupVersionResource = schema.GroupVersionResource{Group: batchv1beta1.GroupName, Version: "v1beta1", Resource: "cronjobs"}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getPodTemplateSpec(labels map[string]string) v1.PodTemplateSpec {
 | 
					func getPodTemplateSpec(labels map[string]string) v1.PodTemplateSpec {
 | 
				
			||||||
@@ -264,19 +264,19 @@ func gatherMetrics(f *framework.Framework) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newCronJob(name, schedule string) *batchv2alpha1.CronJob {
 | 
					func newCronJob(name, schedule string) *batchv1beta1.CronJob {
 | 
				
			||||||
	parallelism := int32(1)
 | 
						parallelism := int32(1)
 | 
				
			||||||
	completions := int32(1)
 | 
						completions := int32(1)
 | 
				
			||||||
	return &batchv2alpha1.CronJob{
 | 
						return &batchv1beta1.CronJob{
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
			Name: name,
 | 
								Name: name,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		TypeMeta: metav1.TypeMeta{
 | 
							TypeMeta: metav1.TypeMeta{
 | 
				
			||||||
			Kind: "CronJob",
 | 
								Kind: "CronJob",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Spec: batchv2alpha1.CronJobSpec{
 | 
							Spec: batchv1beta1.CronJobSpec{
 | 
				
			||||||
			Schedule: schedule,
 | 
								Schedule: schedule,
 | 
				
			||||||
			JobTemplate: batchv2alpha1.JobTemplateSpec{
 | 
								JobTemplate: batchv1beta1.JobTemplateSpec{
 | 
				
			||||||
				Spec: batchv1.JobSpec{
 | 
									Spec: batchv1.JobSpec{
 | 
				
			||||||
					Parallelism: ¶llelism,
 | 
										Parallelism: ¶llelism,
 | 
				
			||||||
					Completions: &completions,
 | 
										Completions: &completions,
 | 
				
			||||||
@@ -940,7 +940,7 @@ var _ = SIGDescribe("Garbage collector", func() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		By("Create the cronjob")
 | 
							By("Create the cronjob")
 | 
				
			||||||
		cronJob := newCronJob("simple", "*/1 * * * ?")
 | 
							cronJob := newCronJob("simple", "*/1 * * * ?")
 | 
				
			||||||
		cronJob, err := f.ClientSet.BatchV2alpha1().CronJobs(f.Namespace.Name).Create(cronJob)
 | 
							cronJob, err := f.ClientSet.BatchV1beta1().CronJobs(f.Namespace.Name).Create(cronJob)
 | 
				
			||||||
		Expect(err).NotTo(HaveOccurred())
 | 
							Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		By("Wait for the CronJob to create new Job")
 | 
							By("Wait for the CronJob to create new Job")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ import (
 | 
				
			|||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/labels"
 | 
						"k8s.io/apimachinery/pkg/labels"
 | 
				
			||||||
@@ -212,20 +212,20 @@ var _ = SIGDescribe("Generated release_1_5 clientset", func() {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newTestingCronJob(name string, value string) *batchv2alpha1.CronJob {
 | 
					func newTestingCronJob(name string, value string) *batchv1beta1.CronJob {
 | 
				
			||||||
	parallelism := int32(1)
 | 
						parallelism := int32(1)
 | 
				
			||||||
	completions := int32(1)
 | 
						completions := int32(1)
 | 
				
			||||||
	return &batchv2alpha1.CronJob{
 | 
						return &batchv1beta1.CronJob{
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
			Name: name,
 | 
								Name: name,
 | 
				
			||||||
			Labels: map[string]string{
 | 
								Labels: map[string]string{
 | 
				
			||||||
				"time": value,
 | 
									"time": value,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Spec: batchv2alpha1.CronJobSpec{
 | 
							Spec: batchv1beta1.CronJobSpec{
 | 
				
			||||||
			Schedule:          "*/1 * * * ?",
 | 
								Schedule:          "*/1 * * * ?",
 | 
				
			||||||
			ConcurrencyPolicy: batchv2alpha1.AllowConcurrent,
 | 
								ConcurrencyPolicy: batchv1beta1.AllowConcurrent,
 | 
				
			||||||
			JobTemplate: batchv2alpha1.JobTemplateSpec{
 | 
								JobTemplate: batchv1beta1.JobTemplateSpec{
 | 
				
			||||||
				Spec: batchv1.JobSpec{
 | 
									Spec: batchv1.JobSpec{
 | 
				
			||||||
					Parallelism: ¶llelism,
 | 
										Parallelism: ¶llelism,
 | 
				
			||||||
					Completions: &completions,
 | 
										Completions: &completions,
 | 
				
			||||||
@@ -262,25 +262,13 @@ func newTestingCronJob(name string, value string) *batchv2alpha1.CronJob {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var _ = SIGDescribe("Generated release_1_5 clientset", func() {
 | 
					var _ = SIGDescribe("Generated release_1_5 clientset", func() {
 | 
				
			||||||
	f := framework.NewDefaultFramework("clientset")
 | 
						f := framework.NewDefaultFramework("clientset")
 | 
				
			||||||
	It("should create v2alpha1 cronJobs, delete cronJobs, watch cronJobs", func() {
 | 
					
 | 
				
			||||||
		var enabled bool
 | 
						BeforeEach(func() {
 | 
				
			||||||
		groupList, err := f.ClientSet.Discovery().ServerGroups()
 | 
							framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResource, f.Namespace.Name)
 | 
				
			||||||
		framework.ExpectNoError(err)
 | 
						})
 | 
				
			||||||
		for _, group := range groupList.Groups {
 | 
					
 | 
				
			||||||
			if group.Name == batchv2alpha1.GroupName {
 | 
						It("should create v1beta1 cronJobs, delete cronJobs, watch cronJobs", func() {
 | 
				
			||||||
				for _, version := range group.Versions {
 | 
							cronJobClient := f.ClientSet.BatchV1beta1().CronJobs(f.Namespace.Name)
 | 
				
			||||||
					if version.Version == batchv2alpha1.SchemeGroupVersion.Version {
 | 
					 | 
				
			||||||
						enabled = true
 | 
					 | 
				
			||||||
						break
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !enabled {
 | 
					 | 
				
			||||||
			framework.Logf("%s is not enabled, test skipped", batchv2alpha1.SchemeGroupVersion)
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		cronJobClient := f.ClientSet.BatchV2alpha1().CronJobs(f.Namespace.Name)
 | 
					 | 
				
			||||||
		By("constructing the cronJob")
 | 
							By("constructing the cronJob")
 | 
				
			||||||
		name := "cronjob" + string(uuid.NewUUID())
 | 
							name := "cronjob" + string(uuid.NewUUID())
 | 
				
			||||||
		value := strconv.Itoa(time.Now().Nanosecond())
 | 
							value := strconv.Itoa(time.Now().Nanosecond())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,6 @@ go_library(
 | 
				
			|||||||
        "//pkg/api:go_default_library",
 | 
					        "//pkg/api:go_default_library",
 | 
				
			||||||
        "//pkg/api/v1/pod:go_default_library",
 | 
					        "//pkg/api/v1/pod:go_default_library",
 | 
				
			||||||
        "//pkg/apis/batch:go_default_library",
 | 
					        "//pkg/apis/batch:go_default_library",
 | 
				
			||||||
        "//pkg/apis/batch/v2alpha1:go_default_library",
 | 
					 | 
				
			||||||
        "//pkg/apis/extensions:go_default_library",
 | 
					        "//pkg/apis/extensions:go_default_library",
 | 
				
			||||||
        "//pkg/client/clientset_generated/internalclientset:go_default_library",
 | 
					        "//pkg/client/clientset_generated/internalclientset:go_default_library",
 | 
				
			||||||
        "//pkg/controller:go_default_library",
 | 
					        "//pkg/controller:go_default_library",
 | 
				
			||||||
@@ -45,7 +44,7 @@ go_library(
 | 
				
			|||||||
        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/apps/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/apps/v1beta2:go_default_library",
 | 
					        "//vendor/k8s.io/api/apps/v1beta2:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/batch/v2alpha1:go_default_library",
 | 
					        "//vendor/k8s.io/api/batch/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
					        "//vendor/k8s.io/api/core/v1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
 | 
				
			||||||
        "//vendor/k8s.io/api/policy/v1beta1:go_default_library",
 | 
					        "//vendor/k8s.io/api/policy/v1beta1:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@ import (
 | 
				
			|||||||
	. "github.com/onsi/gomega"
 | 
						. "github.com/onsi/gomega"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	batchv1 "k8s.io/api/batch/v1"
 | 
						batchv1 "k8s.io/api/batch/v1"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/api/batch/v2alpha1"
 | 
						batchv1beta1 "k8s.io/api/batch/v1beta1"
 | 
				
			||||||
	"k8s.io/api/core/v1"
 | 
						"k8s.io/api/core/v1"
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/api/errors"
 | 
						"k8s.io/apimachinery/pkg/api/errors"
 | 
				
			||||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
				
			||||||
@@ -51,13 +51,13 @@ var _ = SIGDescribe("CronJob", func() {
 | 
				
			|||||||
	successCommand := []string{"/bin/true"}
 | 
						successCommand := []string{"/bin/true"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BeforeEach(func() {
 | 
						BeforeEach(func() {
 | 
				
			||||||
		framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResource, f.Namespace.Name)
 | 
							framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResourceBeta, f.Namespace.Name)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// multiple jobs running at once
 | 
						// multiple jobs running at once
 | 
				
			||||||
	It("should schedule multiple jobs concurrently", func() {
 | 
						It("should schedule multiple jobs concurrently", func() {
 | 
				
			||||||
		By("Creating a cronjob")
 | 
							By("Creating a cronjob")
 | 
				
			||||||
		cronJob := newTestCronJob("concurrent", "*/1 * * * ?", batchv2alpha1.AllowConcurrent,
 | 
							cronJob := newTestCronJob("concurrent", "*/1 * * * ?", batchv1beta1.AllowConcurrent,
 | 
				
			||||||
			sleepCommand, nil)
 | 
								sleepCommand, nil)
 | 
				
			||||||
		cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
							cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
				
			||||||
		Expect(err).NotTo(HaveOccurred())
 | 
							Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
@@ -80,7 +80,7 @@ var _ = SIGDescribe("CronJob", func() {
 | 
				
			|||||||
	// suspended should not schedule jobs
 | 
						// suspended should not schedule jobs
 | 
				
			||||||
	It("should not schedule jobs when suspended [Slow]", func() {
 | 
						It("should not schedule jobs when suspended [Slow]", func() {
 | 
				
			||||||
		By("Creating a suspended cronjob")
 | 
							By("Creating a suspended cronjob")
 | 
				
			||||||
		cronJob := newTestCronJob("suspended", "*/1 * * * ?", batchv2alpha1.AllowConcurrent,
 | 
							cronJob := newTestCronJob("suspended", "*/1 * * * ?", batchv1beta1.AllowConcurrent,
 | 
				
			||||||
			sleepCommand, nil)
 | 
								sleepCommand, nil)
 | 
				
			||||||
		t := true
 | 
							t := true
 | 
				
			||||||
		cronJob.Spec.Suspend = &t
 | 
							cronJob.Spec.Suspend = &t
 | 
				
			||||||
@@ -104,7 +104,7 @@ var _ = SIGDescribe("CronJob", func() {
 | 
				
			|||||||
	// only single active job is allowed for ForbidConcurrent
 | 
						// only single active job is allowed for ForbidConcurrent
 | 
				
			||||||
	It("should not schedule new jobs when ForbidConcurrent [Slow]", func() {
 | 
						It("should not schedule new jobs when ForbidConcurrent [Slow]", func() {
 | 
				
			||||||
		By("Creating a ForbidConcurrent cronjob")
 | 
							By("Creating a ForbidConcurrent cronjob")
 | 
				
			||||||
		cronJob := newTestCronJob("forbid", "*/1 * * * ?", batchv2alpha1.ForbidConcurrent,
 | 
							cronJob := newTestCronJob("forbid", "*/1 * * * ?", batchv1beta1.ForbidConcurrent,
 | 
				
			||||||
			sleepCommand, nil)
 | 
								sleepCommand, nil)
 | 
				
			||||||
		cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
							cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
				
			||||||
		Expect(err).NotTo(HaveOccurred())
 | 
							Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
@@ -136,7 +136,7 @@ var _ = SIGDescribe("CronJob", func() {
 | 
				
			|||||||
	// only single active job is allowed for ReplaceConcurrent
 | 
						// only single active job is allowed for ReplaceConcurrent
 | 
				
			||||||
	It("should replace jobs when ReplaceConcurrent", func() {
 | 
						It("should replace jobs when ReplaceConcurrent", func() {
 | 
				
			||||||
		By("Creating a ReplaceConcurrent cronjob")
 | 
							By("Creating a ReplaceConcurrent cronjob")
 | 
				
			||||||
		cronJob := newTestCronJob("replace", "*/1 * * * ?", batchv2alpha1.ReplaceConcurrent,
 | 
							cronJob := newTestCronJob("replace", "*/1 * * * ?", batchv1beta1.ReplaceConcurrent,
 | 
				
			||||||
			sleepCommand, nil)
 | 
								sleepCommand, nil)
 | 
				
			||||||
		cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
							cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
				
			||||||
		Expect(err).NotTo(HaveOccurred())
 | 
							Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
@@ -168,7 +168,7 @@ var _ = SIGDescribe("CronJob", func() {
 | 
				
			|||||||
	// shouldn't give us unexpected warnings
 | 
						// shouldn't give us unexpected warnings
 | 
				
			||||||
	It("should not emit unexpected warnings", func() {
 | 
						It("should not emit unexpected warnings", func() {
 | 
				
			||||||
		By("Creating a cronjob")
 | 
							By("Creating a cronjob")
 | 
				
			||||||
		cronJob := newTestCronJob("concurrent", "*/1 * * * ?", batchv2alpha1.AllowConcurrent,
 | 
							cronJob := newTestCronJob("concurrent", "*/1 * * * ?", batchv1beta1.AllowConcurrent,
 | 
				
			||||||
			nil, nil)
 | 
								nil, nil)
 | 
				
			||||||
		cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
							cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
				
			||||||
		Expect(err).NotTo(HaveOccurred())
 | 
							Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
@@ -191,7 +191,7 @@ var _ = SIGDescribe("CronJob", func() {
 | 
				
			|||||||
	// deleted jobs should be removed from the active list
 | 
						// deleted jobs should be removed from the active list
 | 
				
			||||||
	It("should remove from active list jobs that have been deleted", func() {
 | 
						It("should remove from active list jobs that have been deleted", func() {
 | 
				
			||||||
		By("Creating a ForbidConcurrent cronjob")
 | 
							By("Creating a ForbidConcurrent cronjob")
 | 
				
			||||||
		cronJob := newTestCronJob("forbid", "*/1 * * * ?", batchv2alpha1.ForbidConcurrent,
 | 
							cronJob := newTestCronJob("forbid", "*/1 * * * ?", batchv1beta1.ForbidConcurrent,
 | 
				
			||||||
			sleepCommand, nil)
 | 
								sleepCommand, nil)
 | 
				
			||||||
		cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
							cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
				
			||||||
		Expect(err).NotTo(HaveOccurred())
 | 
							Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
@@ -235,7 +235,7 @@ var _ = SIGDescribe("CronJob", func() {
 | 
				
			|||||||
	It("should delete successful finished jobs with limit of one successful job", func() {
 | 
						It("should delete successful finished jobs with limit of one successful job", func() {
 | 
				
			||||||
		By("Creating a AllowConcurrent cronjob with custom history limits")
 | 
							By("Creating a AllowConcurrent cronjob with custom history limits")
 | 
				
			||||||
		successLimit := int32(1)
 | 
							successLimit := int32(1)
 | 
				
			||||||
		cronJob := newTestCronJob("concurrent-limit", "*/1 * * * ?", batchv2alpha1.AllowConcurrent,
 | 
							cronJob := newTestCronJob("concurrent-limit", "*/1 * * * ?", batchv1beta1.AllowConcurrent,
 | 
				
			||||||
			successCommand, &successLimit)
 | 
								successCommand, &successLimit)
 | 
				
			||||||
		cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
							cronJob, err := createCronJob(f.ClientSet, f.Namespace.Name, cronJob)
 | 
				
			||||||
		Expect(err).NotTo(HaveOccurred())
 | 
							Expect(err).NotTo(HaveOccurred())
 | 
				
			||||||
@@ -271,21 +271,21 @@ var _ = SIGDescribe("CronJob", func() {
 | 
				
			|||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// newTestCronJob returns a cronjob which does one of several testing behaviors.
 | 
					// newTestCronJob returns a cronjob which does one of several testing behaviors.
 | 
				
			||||||
func newTestCronJob(name, schedule string, concurrencyPolicy batchv2alpha1.ConcurrencyPolicy,
 | 
					func newTestCronJob(name, schedule string, concurrencyPolicy batchv1beta1.ConcurrencyPolicy,
 | 
				
			||||||
	command []string, successfulJobsHistoryLimit *int32) *batchv2alpha1.CronJob {
 | 
						command []string, successfulJobsHistoryLimit *int32) *batchv1beta1.CronJob {
 | 
				
			||||||
	parallelism := int32(1)
 | 
						parallelism := int32(1)
 | 
				
			||||||
	completions := int32(1)
 | 
						completions := int32(1)
 | 
				
			||||||
	sj := &batchv2alpha1.CronJob{
 | 
						sj := &batchv1beta1.CronJob{
 | 
				
			||||||
		ObjectMeta: metav1.ObjectMeta{
 | 
							ObjectMeta: metav1.ObjectMeta{
 | 
				
			||||||
			Name: name,
 | 
								Name: name,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		TypeMeta: metav1.TypeMeta{
 | 
							TypeMeta: metav1.TypeMeta{
 | 
				
			||||||
			Kind: "CronJob",
 | 
								Kind: "CronJob",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Spec: batchv2alpha1.CronJobSpec{
 | 
							Spec: batchv1beta1.CronJobSpec{
 | 
				
			||||||
			Schedule:          schedule,
 | 
								Schedule:          schedule,
 | 
				
			||||||
			ConcurrencyPolicy: concurrencyPolicy,
 | 
								ConcurrencyPolicy: concurrencyPolicy,
 | 
				
			||||||
			JobTemplate: batchv2alpha1.JobTemplateSpec{
 | 
								JobTemplate: batchv1beta1.JobTemplateSpec{
 | 
				
			||||||
				Spec: batchv1.JobSpec{
 | 
									Spec: batchv1.JobSpec{
 | 
				
			||||||
					Parallelism: ¶llelism,
 | 
										Parallelism: ¶llelism,
 | 
				
			||||||
					Completions: &completions,
 | 
										Completions: &completions,
 | 
				
			||||||
@@ -325,22 +325,22 @@ func newTestCronJob(name, schedule string, concurrencyPolicy batchv2alpha1.Concu
 | 
				
			|||||||
	return sj
 | 
						return sj
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func createCronJob(c clientset.Interface, ns string, cronJob *batchv2alpha1.CronJob) (*batchv2alpha1.CronJob, error) {
 | 
					func createCronJob(c clientset.Interface, ns string, cronJob *batchv1beta1.CronJob) (*batchv1beta1.CronJob, error) {
 | 
				
			||||||
	return c.BatchV2alpha1().CronJobs(ns).Create(cronJob)
 | 
						return c.BatchV1beta1().CronJobs(ns).Create(cronJob)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getCronJob(c clientset.Interface, ns, name string) (*batchv2alpha1.CronJob, error) {
 | 
					func getCronJob(c clientset.Interface, ns, name string) (*batchv1beta1.CronJob, error) {
 | 
				
			||||||
	return c.BatchV2alpha1().CronJobs(ns).Get(name, metav1.GetOptions{})
 | 
						return c.BatchV1beta1().CronJobs(ns).Get(name, metav1.GetOptions{})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func deleteCronJob(c clientset.Interface, ns, name string) error {
 | 
					func deleteCronJob(c clientset.Interface, ns, name string) error {
 | 
				
			||||||
	return c.BatchV2alpha1().CronJobs(ns).Delete(name, nil)
 | 
						return c.BatchV1beta1().CronJobs(ns).Delete(name, nil)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Wait for at least given amount of active jobs.
 | 
					// Wait for at least given amount of active jobs.
 | 
				
			||||||
func waitForActiveJobs(c clientset.Interface, ns, cronJobName string, active int) error {
 | 
					func waitForActiveJobs(c clientset.Interface, ns, cronJobName string, active int) error {
 | 
				
			||||||
	return wait.Poll(framework.Poll, cronJobTimeout, func() (bool, error) {
 | 
						return wait.Poll(framework.Poll, cronJobTimeout, func() (bool, error) {
 | 
				
			||||||
		curr, err := c.BatchV2alpha1().CronJobs(ns).Get(cronJobName, metav1.GetOptions{})
 | 
							curr, err := c.BatchV1beta1().CronJobs(ns).Get(cronJobName, metav1.GetOptions{})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return false, err
 | 
								return false, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -354,7 +354,7 @@ func waitForActiveJobs(c clientset.Interface, ns, cronJobName string, active int
 | 
				
			|||||||
// empty after the timeout.
 | 
					// empty after the timeout.
 | 
				
			||||||
func waitForNoJobs(c clientset.Interface, ns, jobName string, failIfNonEmpty bool) error {
 | 
					func waitForNoJobs(c clientset.Interface, ns, jobName string, failIfNonEmpty bool) error {
 | 
				
			||||||
	return wait.Poll(framework.Poll, cronJobTimeout, func() (bool, error) {
 | 
						return wait.Poll(framework.Poll, cronJobTimeout, func() (bool, error) {
 | 
				
			||||||
		curr, err := c.BatchV2alpha1().CronJobs(ns).Get(jobName, metav1.GetOptions{})
 | 
							curr, err := c.BatchV1beta1().CronJobs(ns).Get(jobName, metav1.GetOptions{})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return false, err
 | 
								return false, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -432,7 +432,7 @@ func waitForAnyFinishedJob(c clientset.Interface, ns string) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// checkNoEventWithReason checks no events with a reason within a list has occured
 | 
					// checkNoEventWithReason checks no events with a reason within a list has occured
 | 
				
			||||||
func checkNoEventWithReason(c clientset.Interface, ns, cronJobName string, reasons []string) error {
 | 
					func checkNoEventWithReason(c clientset.Interface, ns, cronJobName string, reasons []string) error {
 | 
				
			||||||
	sj, err := c.BatchV2alpha1().CronJobs(ns).Get(cronJobName, metav1.GetOptions{})
 | 
						sj, err := c.BatchV1beta1().CronJobs(ns).Get(cronJobName, metav1.GetOptions{})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return fmt.Errorf("Error in getting cronjob %s/%s: %v", ns, cronJobName, err)
 | 
							return fmt.Errorf("Error in getting cronjob %s/%s: %v", ns, cronJobName, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,6 @@ package apps
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
						"k8s.io/apimachinery/pkg/runtime/schema"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/kubernetes/pkg/apis/batch/v2alpha1"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -32,5 +31,6 @@ const (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	CronJobGroupVersionResource = schema.GroupVersionResource{Group: batchv2alpha1.GroupName, Version: "v2alpha1", Resource: "cronjobs"}
 | 
						CronJobGroupVersionResourceAlpha = schema.GroupVersionResource{Group: "batch", Version: "v2alpha1", Resource: "cronjobs"}
 | 
				
			||||||
 | 
						CronJobGroupVersionResourceBeta  = schema.GroupVersionResource{Group: "batch", Version: "v1beta1", Resource: "cronjobs"}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,6 @@ go_library(
 | 
				
			|||||||
        "portforward.go",
 | 
					        "portforward.go",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
        "//pkg/apis/batch/v2alpha1:go_default_library",
 | 
					 | 
				
			||||||
        "//pkg/controller:go_default_library",
 | 
					        "//pkg/controller:go_default_library",
 | 
				
			||||||
        "//pkg/kubectl/cmd/util:go_default_library",
 | 
					        "//pkg/kubectl/cmd/util:go_default_library",
 | 
				
			||||||
        "//pkg/util/version:go_default_library",
 | 
					        "//pkg/util/version:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,7 +56,6 @@ import (
 | 
				
			|||||||
	"k8s.io/apiserver/pkg/authentication/serviceaccount"
 | 
						"k8s.io/apiserver/pkg/authentication/serviceaccount"
 | 
				
			||||||
	genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
 | 
						genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	batchv2alpha1 "k8s.io/kubernetes/pkg/apis/batch/v2alpha1"
 | 
					 | 
				
			||||||
	"k8s.io/kubernetes/pkg/controller"
 | 
						"k8s.io/kubernetes/pkg/controller"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/kubectl/cmd/util"
 | 
						"k8s.io/kubernetes/pkg/kubectl/cmd/util"
 | 
				
			||||||
	utilversion "k8s.io/kubernetes/pkg/util/version"
 | 
						utilversion "k8s.io/kubernetes/pkg/util/version"
 | 
				
			||||||
@@ -145,7 +144,8 @@ var (
 | 
				
			|||||||
	// so we don't expect tests that verifies return code to work on kubectl clients before that.
 | 
						// so we don't expect tests that verifies return code to work on kubectl clients before that.
 | 
				
			||||||
	kubectlContainerExitCodeVersion = utilversion.MustParseSemantic("v1.4.0-alpha.3")
 | 
						kubectlContainerExitCodeVersion = utilversion.MustParseSemantic("v1.4.0-alpha.3")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CronJobGroupVersionResource = schema.GroupVersionResource{Group: batchv2alpha1.GroupName, Version: "v2alpha1", Resource: "cronjobs"}
 | 
						CronJobGroupVersionResourceAlpha = schema.GroupVersionResource{Group: "batch", Version: "v2alpha1", Resource: "cronjobs"}
 | 
				
			||||||
 | 
						CronJobGroupVersionResourceBeta  = schema.GroupVersionResource{Group: "batch", Version: "v1beta1", Resource: "cronjobs"}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Stops everything from filePath from namespace ns and checks if everything matching selectors from the given namespace is correctly stopped.
 | 
					// Stops everything from filePath from namespace ns and checks if everything matching selectors from the given namespace is correctly stopped.
 | 
				
			||||||
@@ -203,15 +203,15 @@ var _ = SIGDescribe("Kubectl alpha client", func() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		BeforeEach(func() {
 | 
							BeforeEach(func() {
 | 
				
			||||||
			nsFlag = fmt.Sprintf("--namespace=%v", ns)
 | 
								nsFlag = fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
			cjName = "e2e-test-echo-cronjob"
 | 
								cjName = "e2e-test-echo-cronjob-alpha"
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		AfterEach(func() {
 | 
							AfterEach(func() {
 | 
				
			||||||
			framework.RunKubectlOrDie("delete", "cronjobs", cjName, nsFlag)
 | 
								framework.RunKubectlOrDie("delete", "cronjob.v2alpha1.batch", cjName, nsFlag)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		It("should create a CronJob", func() {
 | 
							It("should create a CronJob", func() {
 | 
				
			||||||
			framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResource, f.Namespace.Name)
 | 
								framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResourceAlpha, f.Namespace.Name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			schedule := "*/5 * * * ?"
 | 
								schedule := "*/5 * * * ?"
 | 
				
			||||||
			framework.RunKubectlOrDie("run", cjName, "--restart=OnFailure", "--generator=cronjob/v2alpha1",
 | 
								framework.RunKubectlOrDie("run", cjName, "--restart=OnFailure", "--generator=cronjob/v2alpha1",
 | 
				
			||||||
@@ -1349,6 +1349,43 @@ metadata:
 | 
				
			|||||||
		})
 | 
							})
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						framework.KubeDescribe("Kubectl run CronJob", func() {
 | 
				
			||||||
 | 
							var nsFlag string
 | 
				
			||||||
 | 
							var cjName string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							BeforeEach(func() {
 | 
				
			||||||
 | 
								nsFlag = fmt.Sprintf("--namespace=%v", ns)
 | 
				
			||||||
 | 
								cjName = "e2e-test-echo-cronjob-beta"
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							AfterEach(func() {
 | 
				
			||||||
 | 
								framework.RunKubectlOrDie("delete", "cronjob.v1beta1.batch", cjName, nsFlag)
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							It("should create a CronJob", func() {
 | 
				
			||||||
 | 
								framework.SkipIfMissingResource(f.ClientPool, CronJobGroupVersionResourceBeta, f.Namespace.Name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								schedule := "*/5 * * * ?"
 | 
				
			||||||
 | 
								framework.RunKubectlOrDie("run", cjName, "--restart=OnFailure", "--generator=cronjob/v1beta1",
 | 
				
			||||||
 | 
									"--schedule="+schedule, "--image="+busyboxImage, nsFlag)
 | 
				
			||||||
 | 
								By("verifying the CronJob " + cjName + " was created")
 | 
				
			||||||
 | 
								cj, err := c.BatchV1beta1().CronJobs(ns).Get(cjName, metav1.GetOptions{})
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									framework.Failf("Failed getting CronJob %s: %v", cjName, err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if cj.Spec.Schedule != schedule {
 | 
				
			||||||
 | 
									framework.Failf("Failed creating a CronJob with correct schedule %s", schedule)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								containers := cj.Spec.JobTemplate.Spec.Template.Spec.Containers
 | 
				
			||||||
 | 
								if containers == nil || len(containers) != 1 || containers[0].Image != busyboxImage {
 | 
				
			||||||
 | 
									framework.Failf("Failed creating CronJob %s for 1 pod with expected image %s: %#v", cjName, busyboxImage, containers)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if cj.Spec.JobTemplate.Spec.Template.Spec.RestartPolicy != v1.RestartPolicyOnFailure {
 | 
				
			||||||
 | 
									framework.Failf("Failed creating a CronJob with correct restart policy for --restart=OnFailure")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	framework.KubeDescribe("Kubectl run pod", func() {
 | 
						framework.KubeDescribe("Kubectl run pod", func() {
 | 
				
			||||||
		var nsFlag string
 | 
							var nsFlag string
 | 
				
			||||||
		var podName string
 | 
							var podName string
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -201,8 +201,6 @@ var etcdStorageData = map[schema.GroupVersionResource]struct {
 | 
				
			|||||||
	gvr("batch", "v1beta1", "cronjobs"): {
 | 
						gvr("batch", "v1beta1", "cronjobs"): {
 | 
				
			||||||
		stub:             `{"metadata": {"name": "cjv1beta1"}, "spec": {"jobTemplate": {"spec": {"template": {"metadata": {"labels": {"controller-uid": "uid0"}}, "spec": {"containers": [{"image": "fedora:latest", "name": "container0"}], "dnsPolicy": "ClusterFirst", "restartPolicy": "Never"}}}}, "schedule": "* * * * *"}}`,
 | 
							stub:             `{"metadata": {"name": "cjv1beta1"}, "spec": {"jobTemplate": {"spec": {"template": {"metadata": {"labels": {"controller-uid": "uid0"}}, "spec": {"containers": [{"image": "fedora:latest", "name": "container0"}], "dnsPolicy": "ClusterFirst", "restartPolicy": "Never"}}}}, "schedule": "* * * * *"}}`,
 | 
				
			||||||
		expectedEtcdPath: "/registry/cronjobs/etcdstoragepathtestnamespace/cjv1beta1",
 | 
							expectedEtcdPath: "/registry/cronjobs/etcdstoragepathtestnamespace/cjv1beta1",
 | 
				
			||||||
		// TODO this needs to be updated to batch/v1beta1 when it's enabed by default
 | 
					 | 
				
			||||||
		expectedGVK: gvkP("batch", "v2alpha1", "CronJob"),
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	// --
 | 
						// --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -210,6 +208,7 @@ var etcdStorageData = map[schema.GroupVersionResource]struct {
 | 
				
			|||||||
	gvr("batch", "v2alpha1", "cronjobs"): {
 | 
						gvr("batch", "v2alpha1", "cronjobs"): {
 | 
				
			||||||
		stub:             `{"metadata": {"name": "cjv2alpha1"}, "spec": {"jobTemplate": {"spec": {"template": {"metadata": {"labels": {"controller-uid": "uid0"}}, "spec": {"containers": [{"image": "fedora:latest", "name": "container0"}], "dnsPolicy": "ClusterFirst", "restartPolicy": "Never"}}}}, "schedule": "* * * * *"}}`,
 | 
							stub:             `{"metadata": {"name": "cjv2alpha1"}, "spec": {"jobTemplate": {"spec": {"template": {"metadata": {"labels": {"controller-uid": "uid0"}}, "spec": {"containers": [{"image": "fedora:latest", "name": "container0"}], "dnsPolicy": "ClusterFirst", "restartPolicy": "Never"}}}}, "schedule": "* * * * *"}}`,
 | 
				
			||||||
		expectedEtcdPath: "/registry/cronjobs/etcdstoragepathtestnamespace/cjv2alpha1",
 | 
							expectedEtcdPath: "/registry/cronjobs/etcdstoragepathtestnamespace/cjv2alpha1",
 | 
				
			||||||
 | 
							expectedGVK:      gvkP("batch", "v1beta1", "CronJob"),
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	// --
 | 
						// --
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -300,7 +300,13 @@ func NewMasterConfig() *master.Config {
 | 
				
			|||||||
	info, _ := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), runtime.ContentTypeJSON)
 | 
						info, _ := runtime.SerializerInfoForMediaType(api.Codecs.SupportedMediaTypes(), runtime.ContentTypeJSON)
 | 
				
			||||||
	ns := NewSingleContentTypeSerializer(api.Scheme, info)
 | 
						ns := NewSingleContentTypeSerializer(api.Scheme, info)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	storageFactory := serverstorage.NewDefaultStorageFactory(etcdOptions.StorageConfig, runtime.ContentTypeJSON, ns, serverstorage.NewDefaultResourceEncodingConfig(api.Registry), master.DefaultAPIResourceConfigSource())
 | 
						resourceEncoding := serverstorage.NewDefaultResourceEncodingConfig(api.Registry)
 | 
				
			||||||
 | 
						// FIXME (soltysh): this GroupVersionResource override should be configurable
 | 
				
			||||||
 | 
						// we need to set both for the whole group and for cronjobs, separately
 | 
				
			||||||
 | 
						resourceEncoding.SetVersionEncoding(batch.GroupName, *testapi.Batch.GroupVersion(), schema.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal})
 | 
				
			||||||
 | 
						resourceEncoding.SetResourceEncoding(schema.GroupResource{Group: "batch", Resource: "cronjobs"}, schema.GroupVersion{Group: batch.GroupName, Version: "v1beta1"}, schema.GroupVersion{Group: batch.GroupName, Version: runtime.APIVersionInternal})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						storageFactory := serverstorage.NewDefaultStorageFactory(etcdOptions.StorageConfig, runtime.ContentTypeJSON, ns, resourceEncoding, master.DefaultAPIResourceConfigSource())
 | 
				
			||||||
	storageFactory.SetSerializer(
 | 
						storageFactory.SetSerializer(
 | 
				
			||||||
		schema.GroupResource{Group: v1.GroupName, Resource: serverstorage.AllResources},
 | 
							schema.GroupResource{Group: v1.GroupName, Resource: serverstorage.AllResources},
 | 
				
			||||||
		"",
 | 
							"",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user