...

Source file src/k8s.io/kubernetes/pkg/registry/batch/cronjob/storage/storage_test.go

Documentation: k8s.io/kubernetes/pkg/registry/batch/cronjob/storage

     1  /*
     2  Copyright 2016 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package storage
    18  
    19  import (
    20  	"testing"
    21  
    22  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    23  	"k8s.io/apimachinery/pkg/fields"
    24  	"k8s.io/apimachinery/pkg/labels"
    25  	"k8s.io/apimachinery/pkg/runtime"
    26  	"k8s.io/apiserver/pkg/registry/generic"
    27  	genericregistrytest "k8s.io/apiserver/pkg/registry/generic/testing"
    28  	etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing"
    29  	"k8s.io/kubernetes/pkg/apis/batch"
    30  	api "k8s.io/kubernetes/pkg/apis/core"
    31  	"k8s.io/kubernetes/pkg/registry/registrytest"
    32  )
    33  
    34  // TODO: allow for global factory override
    35  func newStorage(t *testing.T) (*REST, *StatusREST, *etcd3testing.EtcdTestServer) {
    36  	etcdStorage, server := registrytest.NewEtcdStorageForResource(t, batch.SchemeGroupVersion.WithResource("cronjobs").GroupResource())
    37  	restOptions := generic.RESTOptions{
    38  		StorageConfig:           etcdStorage,
    39  		Decorator:               generic.UndecoratedStorage,
    40  		DeleteCollectionWorkers: 1,
    41  		ResourcePrefix:          "cronjobs",
    42  	}
    43  	storage, statusStorage, err := NewREST(restOptions)
    44  	if err != nil {
    45  		t.Fatalf("unexpected error from REST storage: %v", err)
    46  	}
    47  	return storage, statusStorage, server
    48  }
    49  
    50  func validNewCronJob() *batch.CronJob {
    51  	return &batch.CronJob{
    52  		ObjectMeta: metav1.ObjectMeta{
    53  			Name:      "foo",
    54  			Namespace: metav1.NamespaceDefault,
    55  		},
    56  		Spec: batch.CronJobSpec{
    57  			Schedule:          "* * * * ?",
    58  			ConcurrencyPolicy: batch.AllowConcurrent,
    59  			JobTemplate: batch.JobTemplateSpec{
    60  				Spec: batch.JobSpec{
    61  					Template: api.PodTemplateSpec{
    62  						Spec: api.PodSpec{
    63  							RestartPolicy: api.RestartPolicyOnFailure,
    64  							DNSPolicy:     api.DNSClusterFirst,
    65  							Containers: []api.Container{{
    66  								Name: "abc", Image: "image",
    67  								ImagePullPolicy:          api.PullIfNotPresent,
    68  								TerminationMessagePolicy: api.TerminationMessageReadFile,
    69  							}},
    70  						},
    71  					},
    72  				},
    73  			},
    74  		},
    75  	}
    76  }
    77  
    78  func TestCreate(t *testing.T) {
    79  	storage, _, server := newStorage(t)
    80  	defer server.Terminate(t)
    81  	defer storage.Store.DestroyFunc()
    82  	test := genericregistrytest.New(t, storage.Store)
    83  	validCronJob := validNewCronJob()
    84  	validCronJob.ObjectMeta = metav1.ObjectMeta{}
    85  	test.TestCreate(
    86  		// valid
    87  		validCronJob,
    88  		// invalid (empty spec)
    89  		&batch.CronJob{
    90  			Spec: batch.CronJobSpec{},
    91  		},
    92  	)
    93  }
    94  
    95  func TestUpdate(t *testing.T) {
    96  	storage, _, server := newStorage(t)
    97  	defer server.Terminate(t)
    98  	defer storage.Store.DestroyFunc()
    99  	test := genericregistrytest.New(t, storage.Store)
   100  	schedule := "1 1 1 1 ?"
   101  	test.TestUpdate(
   102  		// valid
   103  		validNewCronJob(),
   104  		// updateFunc
   105  		func(obj runtime.Object) runtime.Object {
   106  			object := obj.(*batch.CronJob)
   107  			object.Spec.Schedule = schedule
   108  			return object
   109  		},
   110  		// invalid updateFunc
   111  		func(obj runtime.Object) runtime.Object {
   112  			object := obj.(*batch.CronJob)
   113  			object.Spec.Schedule = "* * *"
   114  			return object
   115  		},
   116  	)
   117  }
   118  
   119  func TestDelete(t *testing.T) {
   120  	storage, _, server := newStorage(t)
   121  	defer server.Terminate(t)
   122  	defer storage.Store.DestroyFunc()
   123  	test := genericregistrytest.New(t, storage.Store)
   124  	test.TestDelete(validNewCronJob())
   125  }
   126  
   127  func TestGet(t *testing.T) {
   128  	storage, _, server := newStorage(t)
   129  	defer server.Terminate(t)
   130  	defer storage.Store.DestroyFunc()
   131  	test := genericregistrytest.New(t, storage.Store)
   132  	test.TestGet(validNewCronJob())
   133  }
   134  
   135  func TestList(t *testing.T) {
   136  	storage, _, server := newStorage(t)
   137  	defer server.Terminate(t)
   138  	defer storage.Store.DestroyFunc()
   139  	test := genericregistrytest.New(t, storage.Store)
   140  	test.TestList(validNewCronJob())
   141  }
   142  
   143  func TestWatch(t *testing.T) {
   144  	storage, _, server := newStorage(t)
   145  	defer server.Terminate(t)
   146  	defer storage.Store.DestroyFunc()
   147  	test := genericregistrytest.New(t, storage.Store)
   148  	test.TestWatch(
   149  		validNewCronJob(),
   150  		// matching labels
   151  		[]labels.Set{},
   152  		// not matching labels
   153  		[]labels.Set{
   154  			{"x": "y"},
   155  		},
   156  		// matching fields
   157  		[]fields.Set{},
   158  		// not matching fields
   159  		[]fields.Set{
   160  			{"metadata.name": "xyz"},
   161  			{"name": "foo"},
   162  		},
   163  	)
   164  }
   165  
   166  // TODO: test update /status
   167  

View as plain text