From 8c4341de4e88095959cb08682f1b00895bb7f191 Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Mon, 19 Mar 2018 13:18:23 -0700 Subject: [PATCH 1/6] ReplicaSet: Use apps/v1 for RS controller. --- pkg/controller/replicaset/replica_set.go | 34 ++-- pkg/controller/replicaset/replica_set_test.go | 158 +++++++++--------- .../replicaset/replica_set_utils.go | 30 ++-- .../replicaset/replica_set_utils_test.go | 40 ++--- 4 files changed, 131 insertions(+), 131 deletions(-) diff --git a/pkg/controller/replicaset/replica_set.go b/pkg/controller/replicaset/replica_set.go index 7c7ee2b778d..8139ce25889 100644 --- a/pkg/controller/replicaset/replica_set.go +++ b/pkg/controller/replicaset/replica_set.go @@ -36,21 +36,21 @@ import ( "time" "github.com/golang/glog" + apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" - extensions "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime/schema" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" + appsinformers "k8s.io/client-go/informers/apps/v1" coreinformers "k8s.io/client-go/informers/core/v1" - extensionsinformers "k8s.io/client-go/informers/extensions/v1beta1" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" v1core "k8s.io/client-go/kubernetes/typed/core/v1" + appslisters "k8s.io/client-go/listers/apps/v1" corelisters "k8s.io/client-go/listers/core/v1" - extensionslisters "k8s.io/client-go/listers/extensions/v1beta1" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/record" "k8s.io/client-go/util/integer" @@ -90,7 +90,7 @@ type ReplicaSetController struct { expectations *controller.UIDTrackingControllerExpectations // A store of ReplicaSets, populated by the shared informer passed to NewReplicaSetController - rsLister extensionslisters.ReplicaSetLister + rsLister appslisters.ReplicaSetLister // rsListerSynced returns true if the pod store has been synced at least once. // Added as a member to the struct to allow injection for testing. rsListerSynced cache.InformerSynced @@ -106,12 +106,12 @@ type ReplicaSetController struct { } // NewReplicaSetController configures a replica set controller with the specified event recorder -func NewReplicaSetController(rsInformer extensionsinformers.ReplicaSetInformer, podInformer coreinformers.PodInformer, kubeClient clientset.Interface, burstReplicas int) *ReplicaSetController { +func NewReplicaSetController(rsInformer appsinformers.ReplicaSetInformer, podInformer coreinformers.PodInformer, kubeClient clientset.Interface, burstReplicas int) *ReplicaSetController { eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartLogging(glog.Infof) eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: v1core.New(kubeClient.CoreV1().RESTClient()).Events("")}) return NewBaseController(rsInformer, podInformer, kubeClient, burstReplicas, - extensions.SchemeGroupVersion.WithKind("ReplicaSet"), + apps.SchemeGroupVersion.WithKind("ReplicaSet"), "replicaset_controller", "replicaset", controller.RealPodControl{ @@ -123,7 +123,7 @@ func NewReplicaSetController(rsInformer extensionsinformers.ReplicaSetInformer, // NewBaseController is the implementation of NewReplicaSetController with additional injected // parameters so that it can also serve as the implementation of NewReplicationController. -func NewBaseController(rsInformer extensionsinformers.ReplicaSetInformer, podInformer coreinformers.PodInformer, kubeClient clientset.Interface, burstReplicas int, +func NewBaseController(rsInformer appsinformers.ReplicaSetInformer, podInformer coreinformers.PodInformer, kubeClient clientset.Interface, burstReplicas int, gvk schema.GroupVersionKind, metricOwnerName, queueName string, podControl controller.PodControlInterface) *ReplicaSetController { if kubeClient != nil && kubeClient.CoreV1().RESTClient().GetRateLimiter() != nil { metrics.RegisterMetricAndTrackRateLimiterUsage(metricOwnerName, kubeClient.CoreV1().RESTClient().GetRateLimiter()) @@ -194,7 +194,7 @@ func (rsc *ReplicaSetController) Run(workers int, stopCh <-chan struct{}) { } // getPodReplicaSets returns a list of ReplicaSets matching the given pod. -func (rsc *ReplicaSetController) getPodReplicaSets(pod *v1.Pod) []*extensions.ReplicaSet { +func (rsc *ReplicaSetController) getPodReplicaSets(pod *v1.Pod) []*apps.ReplicaSet { rss, err := rsc.rsLister.GetPodReplicaSets(pod) if err != nil { return nil @@ -210,7 +210,7 @@ func (rsc *ReplicaSetController) getPodReplicaSets(pod *v1.Pod) []*extensions.Re // resolveControllerRef returns the controller referenced by a ControllerRef, // or nil if the ControllerRef could not be resolved to a matching controller // of the correct Kind. -func (rsc *ReplicaSetController) resolveControllerRef(namespace string, controllerRef *metav1.OwnerReference) *extensions.ReplicaSet { +func (rsc *ReplicaSetController) resolveControllerRef(namespace string, controllerRef *metav1.OwnerReference) *apps.ReplicaSet { // We can't look up by UID, so look up by Name and then verify UID. // Don't even try to look up by Name if it's the wrong Kind. if controllerRef.Kind != rsc.Kind { @@ -230,8 +230,8 @@ func (rsc *ReplicaSetController) resolveControllerRef(namespace string, controll // callback when RS is updated func (rsc *ReplicaSetController) updateRS(old, cur interface{}) { - oldRS := old.(*extensions.ReplicaSet) - curRS := cur.(*extensions.ReplicaSet) + oldRS := old.(*apps.ReplicaSet) + curRS := cur.(*apps.ReplicaSet) // You might imagine that we only really need to enqueue the // replica set when Spec changes, but it is safer to sync any @@ -407,7 +407,7 @@ func (rsc *ReplicaSetController) deletePod(obj interface{}) { rsc.enqueueReplicaSet(rs) } -// obj could be an *extensions.ReplicaSet, or a DeletionFinalStateUnknown marker item. +// obj could be an *apps.ReplicaSet, or a DeletionFinalStateUnknown marker item. func (rsc *ReplicaSetController) enqueueReplicaSet(obj interface{}) { key, err := controller.KeyFunc(obj) if err != nil { @@ -417,7 +417,7 @@ func (rsc *ReplicaSetController) enqueueReplicaSet(obj interface{}) { rsc.queue.Add(key) } -// obj could be an *extensions.ReplicaSet, or a DeletionFinalStateUnknown marker item. +// obj could be an *apps.ReplicaSet, or a DeletionFinalStateUnknown marker item. func (rsc *ReplicaSetController) enqueueReplicaSetAfter(obj interface{}, after time.Duration) { key, err := controller.KeyFunc(obj) if err != nil { @@ -456,7 +456,7 @@ func (rsc *ReplicaSetController) processNextWorkItem() bool { // manageReplicas checks and updates replicas for the given ReplicaSet. // Does NOT modify . // It will requeue the replica set in case of an error while creating/deleting pods. -func (rsc *ReplicaSetController) manageReplicas(filteredPods []*v1.Pod, rs *extensions.ReplicaSet) error { +func (rsc *ReplicaSetController) manageReplicas(filteredPods []*v1.Pod, rs *apps.ReplicaSet) error { diff := len(filteredPods) - int(*(rs.Spec.Replicas)) rsKey, err := controller.KeyFunc(rs) if err != nil { @@ -626,7 +626,7 @@ func (rsc *ReplicaSetController) syncReplicaSet(key string) error { newStatus := calculateStatus(rs, filteredPods, manageReplicasErr) // Always updates status as pods come up or die. - updatedRS, err := updateReplicaSetStatus(rsc.kubeClient.ExtensionsV1beta1().ReplicaSets(rs.Namespace), rs, newStatus) + updatedRS, err := updateReplicaSetStatus(rsc.kubeClient.AppsV1().ReplicaSets(rs.Namespace), rs, newStatus) if err != nil { // Multiple things could lead to this update failing. Requeuing the replica set ensures // Returning an error causes a requeue without forcing a hotloop @@ -641,11 +641,11 @@ func (rsc *ReplicaSetController) syncReplicaSet(key string) error { return manageReplicasErr } -func (rsc *ReplicaSetController) claimPods(rs *extensions.ReplicaSet, selector labels.Selector, filteredPods []*v1.Pod) ([]*v1.Pod, error) { +func (rsc *ReplicaSetController) claimPods(rs *apps.ReplicaSet, selector labels.Selector, filteredPods []*v1.Pod) ([]*v1.Pod, error) { // If any adoptions are attempted, we should first recheck for deletion with // an uncached quorum read sometime after listing Pods (see #42639). canAdoptFunc := controller.RecheckDeletionTimestamp(func() (metav1.Object, error) { - fresh, err := rsc.kubeClient.ExtensionsV1beta1().ReplicaSets(rs.Namespace).Get(rs.Name, metav1.GetOptions{}) + fresh, err := rsc.kubeClient.AppsV1().ReplicaSets(rs.Namespace).Get(rs.Name, metav1.GetOptions{}) if err != nil { return nil, err } diff --git a/pkg/controller/replicaset/replica_set_test.go b/pkg/controller/replicaset/replica_set_test.go index 6dc135676ba..4564df7807f 100644 --- a/pkg/controller/replicaset/replica_set_test.go +++ b/pkg/controller/replicaset/replica_set_test.go @@ -28,8 +28,8 @@ import ( "testing" "time" + apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" - extensions "k8s.io/api/extensions/v1beta1" apiequality "k8s.io/apimachinery/pkg/api/equality" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -54,7 +54,7 @@ func testNewReplicaSetControllerFromClient(client clientset.Interface, stopCh ch informers := informers.NewSharedInformerFactory(client, controller.NoResyncPeriodFunc()) ret := NewReplicaSetController( - informers.Extensions().V1beta1().ReplicaSets(), + informers.Apps().V1().ReplicaSets(), informers.Core().V1().Pods(), client, burstReplicas, @@ -78,7 +78,7 @@ func skipListerFunc(verb string, url url.URL) bool { var alwaysReady = func() bool { return true } -func getKey(rs *extensions.ReplicaSet, t *testing.T) string { +func getKey(rs *apps.ReplicaSet, t *testing.T) string { if key, err := controller.KeyFunc(rs); err != nil { t.Errorf("Unexpected error getting key for ReplicaSet %v: %v", rs.Name, err) return "" @@ -87,8 +87,8 @@ func getKey(rs *extensions.ReplicaSet, t *testing.T) string { } } -func newReplicaSet(replicas int, selectorMap map[string]string) *extensions.ReplicaSet { - rs := &extensions.ReplicaSet{ +func newReplicaSet(replicas int, selectorMap map[string]string) *apps.ReplicaSet { + rs := &apps.ReplicaSet{ TypeMeta: metav1.TypeMeta{APIVersion: legacyscheme.Registry.GroupOrDie(v1.GroupName).GroupVersion.String()}, ObjectMeta: metav1.ObjectMeta{ UID: uuid.NewUUID(), @@ -96,7 +96,7 @@ func newReplicaSet(replicas int, selectorMap map[string]string) *extensions.Repl Namespace: metav1.NamespaceDefault, ResourceVersion: "18", }, - Spec: extensions.ReplicaSetSpec{ + Spec: apps.ReplicaSetSpec{ Replicas: func() *int32 { i := int32(replicas); return &i }(), Selector: &metav1.LabelSelector{MatchLabels: selectorMap}, Template: v1.PodTemplateSpec{ @@ -128,7 +128,7 @@ func newReplicaSet(replicas int, selectorMap map[string]string) *extensions.Repl } // create a pod with the given phase for the given rs (same selectors and namespace) -func newPod(name string, rs *extensions.ReplicaSet, status v1.PodPhase, lastTransitionTime *metav1.Time, properlyOwned bool) *v1.Pod { +func newPod(name string, rs *apps.ReplicaSet, status v1.PodPhase, lastTransitionTime *metav1.Time, properlyOwned bool) *v1.Pod { var conditions []v1.PodCondition if status == v1.PodRunning { condition := v1.PodCondition{Type: v1.PodReady, Status: v1.ConditionTrue} @@ -154,7 +154,7 @@ func newPod(name string, rs *extensions.ReplicaSet, status v1.PodPhase, lastTran } // create count pods with the given phase for the given ReplicaSet (same selectors and namespace), and add them to the store. -func newPodList(store cache.Store, count int, status v1.PodPhase, labelMap map[string]string, rs *extensions.ReplicaSet, name string) *v1.PodList { +func newPodList(store cache.Store, count int, status v1.PodPhase, labelMap map[string]string, rs *apps.ReplicaSet, name string) *v1.PodList { pods := []v1.Pod{} var trueVar = true controllerReference := metav1.OwnerReference{UID: rs.UID, APIVersion: "v1beta1", Kind: "ReplicaSet", Name: rs.Name, Controller: &trueVar} @@ -212,7 +212,7 @@ func TestSyncReplicaSetDoesNothing(t *testing.T) { // 2 running pods, a controller with 2 replicas, sync is a no-op labelMap := map[string]string{"foo": "bar"} rsSpec := newReplicaSet(2, labelMap) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) newPodList(informers.Core().V1().Pods().Informer().GetIndexer(), 2, v1.PodRunning, labelMap, rsSpec, "pod") manager.podControl = &fakePodControl @@ -238,7 +238,7 @@ func TestDeleteFinalStateUnknown(t *testing.T) { // the controller matching the selectors of the deleted pod into the work queue. labelMap := map[string]string{"foo": "bar"} rsSpec := newReplicaSet(1, labelMap) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) pods := newPodList(nil, 1, v1.PodRunning, labelMap, rsSpec, "pod") manager.deletePod(cache.DeletedFinalStateUnknown{Key: "foo", Obj: &pods.Items[0]}) @@ -268,7 +268,7 @@ func TestSyncReplicaSetCreateFailures(t *testing.T) { defer close(stopCh) manager, informers := testNewReplicaSetControllerFromClient(client, stopCh, BurstReplicas) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rs) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rs) manager.podControl = &fakePodControl manager.syncReplicaSet(getKey(rs, t)) @@ -303,7 +303,7 @@ func TestSyncReplicaSetDormancy(t *testing.T) { labelMap := map[string]string{"foo": "bar"} rsSpec := newReplicaSet(2, labelMap) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) newPodList(informers.Core().V1().Pods().Informer().GetIndexer(), 1, v1.PodRunning, labelMap, rsSpec, "pod") // Creates a replica and sets expectations @@ -355,23 +355,23 @@ func TestPodControllerLookup(t *testing.T) { defer close(stopCh) manager, informers := testNewReplicaSetControllerFromClient(clientset.NewForConfigOrDie(&restclient.Config{Host: "", ContentConfig: restclient.ContentConfig{GroupVersion: &legacyscheme.Registry.GroupOrDie(v1.GroupName).GroupVersion}}), stopCh, BurstReplicas) testCases := []struct { - inRSs []*extensions.ReplicaSet + inRSs []*apps.ReplicaSet pod *v1.Pod outRSName string }{ // pods without labels don't match any ReplicaSets { - inRSs: []*extensions.ReplicaSet{ + inRSs: []*apps.ReplicaSet{ {ObjectMeta: metav1.ObjectMeta{Name: "basic"}}}, pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo1", Namespace: metav1.NamespaceAll}}, outRSName: "", }, // Matching labels, not namespace { - inRSs: []*extensions.ReplicaSet{ + inRSs: []*apps.ReplicaSet{ { ObjectMeta: metav1.ObjectMeta{Name: "foo"}, - Spec: extensions.ReplicaSetSpec{ + Spec: apps.ReplicaSetSpec{ Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, }, }, @@ -383,10 +383,10 @@ func TestPodControllerLookup(t *testing.T) { }, // Matching ns and labels returns the key to the ReplicaSet, not the ReplicaSet name { - inRSs: []*extensions.ReplicaSet{ + inRSs: []*apps.ReplicaSet{ { ObjectMeta: metav1.ObjectMeta{Name: "bar", Namespace: "ns"}, - Spec: extensions.ReplicaSetSpec{ + Spec: apps.ReplicaSetSpec{ Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, }, }, @@ -399,7 +399,7 @@ func TestPodControllerLookup(t *testing.T) { } for _, c := range testCases { for _, r := range c.inRSs { - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(r) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(r) } if rss := manager.getPodReplicaSets(c.pod); rss != nil { if len(rss) != 1 { @@ -424,25 +424,25 @@ func TestWatchControllers(t *testing.T) { defer close(stopCh) informers := informers.NewSharedInformerFactory(client, controller.NoResyncPeriodFunc()) manager := NewReplicaSetController( - informers.Extensions().V1beta1().ReplicaSets(), + informers.Apps().V1().ReplicaSets(), informers.Core().V1().Pods(), client, BurstReplicas, ) informers.Start(stopCh) - var testRSSpec extensions.ReplicaSet + var testRSSpec apps.ReplicaSet received := make(chan string) // The update sent through the fakeWatcher should make its way into the workqueue, // and eventually into the syncHandler. The handler validates the received controller // and closes the received channel to indicate that the test can finish. manager.syncHandler = func(key string) error { - obj, exists, err := informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().GetByKey(key) + obj, exists, err := informers.Apps().V1().ReplicaSets().Informer().GetIndexer().GetByKey(key) if !exists || err != nil { t.Errorf("Expected to find replica set under key %v", key) } - rsSpec := *obj.(*extensions.ReplicaSet) + rsSpec := *obj.(*apps.ReplicaSet) if !apiequality.Semantic.DeepDerivative(rsSpec, testRSSpec) { t.Errorf("Expected %#v, but got %#v", testRSSpec, rsSpec) } @@ -477,7 +477,7 @@ func TestWatchPods(t *testing.T) { // Put one ReplicaSet into the shared informer labelMap := map[string]string{"foo": "bar"} testRSSpec := newReplicaSet(1, labelMap) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(testRSSpec) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(testRSSpec) received := make(chan string) // The pod update sent through the fakeWatcher should figure out the managing ReplicaSet and @@ -540,12 +540,12 @@ func TestUpdatePods(t *testing.T) { // Put 2 ReplicaSets and one pod into the informers labelMap1 := map[string]string{"foo": "bar"} testRSSpec1 := newReplicaSet(1, labelMap1) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(testRSSpec1) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(testRSSpec1) testRSSpec2 := *testRSSpec1 labelMap2 := map[string]string{"bar": "foo"} testRSSpec2.Spec.Selector = &metav1.LabelSelector{MatchLabels: labelMap2} testRSSpec2.Name = "barfoo" - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(&testRSSpec2) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(&testRSSpec2) isController := true controllerRef1 := metav1.OwnerReference{UID: testRSSpec1.UID, APIVersion: "v1", Kind: "ReplicaSet", Name: testRSSpec1.Name, Controller: &isController} @@ -656,8 +656,8 @@ func TestControllerUpdateRequeue(t *testing.T) { defer close(stopCh) manager, informers := testNewReplicaSetControllerFromClient(client, stopCh, BurstReplicas) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rs) - rs.Status = extensions.ReplicaSetStatus{Replicas: 2} + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rs) + rs.Status = apps.ReplicaSetStatus{Replicas: 2} newPodList(informers.Core().V1().Pods().Informer().GetIndexer(), 1, v1.PodRunning, labelMap, rs, "pod") fakePodControl := controller.FakePodControl{} @@ -678,11 +678,11 @@ func TestControllerUpdateStatusWithFailure(t *testing.T) { fakeClient := &fake.Clientset{} fakeClient.AddReactor("get", "replicasets", func(action core.Action) (bool, runtime.Object, error) { return true, rs, nil }) fakeClient.AddReactor("*", "*", func(action core.Action) (bool, runtime.Object, error) { - return true, &extensions.ReplicaSet{}, fmt.Errorf("Fake error") + return true, &apps.ReplicaSet{}, fmt.Errorf("Fake error") }) - fakeRSClient := fakeClient.Extensions().ReplicaSets("default") + fakeRSClient := fakeClient.Apps().ReplicaSets("default") numReplicas := int32(10) - newStatus := extensions.ReplicaSetStatus{Replicas: numReplicas} + newStatus := apps.ReplicaSetStatus{Replicas: numReplicas} updateReplicaSetStatus(fakeRSClient, rs, newStatus) updates, gets := 0, 0 for _, a := range fakeClient.Actions() { @@ -702,7 +702,7 @@ func TestControllerUpdateStatusWithFailure(t *testing.T) { updates++ // Confirm that the update has the right status.Replicas even though the Get // returned a ReplicaSet with replicas=1. - if c, ok := action.GetObject().(*extensions.ReplicaSet); !ok { + if c, ok := action.GetObject().(*apps.ReplicaSet); !ok { t.Errorf("Expected a ReplicaSet as the argument to update, got %T", c) } else if c.Status.Replicas != numReplicas { t.Errorf("Expected update for ReplicaSet to contain replicas %v, got %v instead", @@ -729,7 +729,7 @@ func doTestControllerBurstReplicas(t *testing.T, burstReplicas, numReplicas int) manager, informers := testNewReplicaSetControllerFromClient(client, stopCh, burstReplicas) manager.podControl = &fakePodControl - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) expectedPods := int32(0) pods := newPodList(nil, numReplicas, v1.PodPending, labelMap, rsSpec, "pod") @@ -743,7 +743,7 @@ func doTestControllerBurstReplicas(t *testing.T, burstReplicas, numReplicas int) for _, replicas := range []int32{int32(numReplicas), 0} { *(rsSpec.Spec.Replicas) = replicas - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) for i := 0; i < numReplicas; i += burstReplicas { manager.syncReplicaSet(getKey(rsSpec, t)) @@ -890,7 +890,7 @@ func TestRSSyncExpectations(t *testing.T) { labelMap := map[string]string{"foo": "bar"} rsSpec := newReplicaSet(2, labelMap) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rsSpec) pods := newPodList(nil, 2, v1.PodPending, labelMap, rsSpec, "pod") informers.Core().V1().Pods().Informer().GetIndexer().Add(&pods.Items[0]) postExpectationsPod := pods.Items[1] @@ -914,7 +914,7 @@ func TestDeleteControllerAndExpectations(t *testing.T) { defer close(stopCh) manager, informers := testNewReplicaSetControllerFromClient(client, stopCh, 10) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rs) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rs) fakePodControl := controller.FakePodControl{} manager.podControl = &fakePodControl @@ -936,7 +936,7 @@ func TestDeleteControllerAndExpectations(t *testing.T) { if !exists || err != nil { t.Errorf("No expectations found for ReplicaSet") } - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Delete(rs) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Delete(rs) manager.syncReplicaSet(getKey(rs, t)) if _, exists, err = manager.expectations.GetExpectations(rsKey); exists { @@ -951,10 +951,10 @@ func TestDeleteControllerAndExpectations(t *testing.T) { } // shuffle returns a new shuffled list of container controllers. -func shuffle(controllers []*extensions.ReplicaSet) []*extensions.ReplicaSet { +func shuffle(controllers []*apps.ReplicaSet) []*apps.ReplicaSet { numControllers := len(controllers) randIndexes := rand.Perm(numControllers) - shuffled := make([]*extensions.ReplicaSet, numControllers) + shuffled := make([]*apps.ReplicaSet, numControllers) for i := 0; i < numControllers; i++ { shuffled[i] = controllers[randIndexes[i]] } @@ -974,7 +974,7 @@ func TestOverlappingRSs(t *testing.T) { // All use the same CreationTimestamp since ControllerRef should be able // to handle that. timestamp := metav1.Date(2014, time.December, 0, 0, 0, 0, 0, time.Local) - var controllers []*extensions.ReplicaSet + var controllers []*apps.ReplicaSet for j := 1; j < 10; j++ { rsSpec := newReplicaSet(1, labelMap) rsSpec.CreationTimestamp = timestamp @@ -983,7 +983,7 @@ func TestOverlappingRSs(t *testing.T) { } shuffledControllers := shuffle(controllers) for j := range shuffledControllers { - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(shuffledControllers[j]) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(shuffledControllers[j]) } // Add a pod with a ControllerRef and make sure only the corresponding // ReplicaSet is synced. Pick a RS in the middle since the old code used to @@ -1012,7 +1012,7 @@ func TestDeletionTimestamp(t *testing.T) { manager, informers := testNewReplicaSetControllerFromClient(c, stopCh, 10) rs := newReplicaSet(1, labelMap) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rs) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rs) rsKey, err := controller.KeyFunc(rs) if err != nil { t.Errorf("Couldn't get key for object %#v: %v", rs, err) @@ -1116,7 +1116,7 @@ func TestDoNotPatchPodWithOtherControlRef(t *testing.T) { stopCh := make(chan struct{}) defer close(stopCh) manager, fakePodControl, informers := setupManagerWithGCEnabled(stopCh, rs) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rs) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rs) var trueVar = true otherControllerReference := metav1.OwnerReference{UID: uuid.NewUUID(), APIVersion: "v1beta1", Kind: "ReplicaSet", Name: "AnotherRS", Controller: &trueVar} // add to podLister a matching Pod controlled by another controller. Expect no patch. @@ -1137,7 +1137,7 @@ func TestPatchPodFails(t *testing.T) { stopCh := make(chan struct{}) defer close(stopCh) manager, fakePodControl, informers := setupManagerWithGCEnabled(stopCh, rs) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rs) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rs) // add to podLister two matching pods. Expect two patches to take control // them. informers.Core().V1().Pods().Informer().GetIndexer().Add(newPod("pod1", rs, v1.PodRunning, nil, false)) @@ -1169,7 +1169,7 @@ func TestDoNotAdoptOrCreateIfBeingDeleted(t *testing.T) { stopCh := make(chan struct{}) defer close(stopCh) manager, fakePodControl, informers := setupManagerWithGCEnabled(stopCh, rs) - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(rs) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(rs) pod1 := newPod("pod1", rs, v1.PodRunning, nil, false) informers.Core().V1().Pods().Informer().GetIndexer().Add(pod1) @@ -1193,7 +1193,7 @@ func TestDoNotAdoptOrCreateIfBeingDeletedRace(t *testing.T) { // Lister (cache) says it's NOT deleted. rs2 := *rs rs2.DeletionTimestamp = nil - informers.Extensions().V1beta1().ReplicaSets().Informer().GetIndexer().Add(&rs2) + informers.Apps().V1().ReplicaSets().Informer().GetIndexer().Add(&rs2) // Recheck occurs if a matching orphan is present. pod1 := newPod("pod1", rs, v1.PodRunning, nil, false) @@ -1209,35 +1209,35 @@ func TestDoNotAdoptOrCreateIfBeingDeletedRace(t *testing.T) { } var ( - imagePullBackOff extensions.ReplicaSetConditionType = "ImagePullBackOff" + imagePullBackOff apps.ReplicaSetConditionType = "ImagePullBackOff" - condImagePullBackOff = func() extensions.ReplicaSetCondition { - return extensions.ReplicaSetCondition{ + condImagePullBackOff = func() apps.ReplicaSetCondition { + return apps.ReplicaSetCondition{ Type: imagePullBackOff, Status: v1.ConditionTrue, Reason: "NonExistentImage", } } - condReplicaFailure = func() extensions.ReplicaSetCondition { - return extensions.ReplicaSetCondition{ - Type: extensions.ReplicaSetReplicaFailure, + condReplicaFailure = func() apps.ReplicaSetCondition { + return apps.ReplicaSetCondition{ + Type: apps.ReplicaSetReplicaFailure, Status: v1.ConditionTrue, Reason: "OtherFailure", } } - condReplicaFailure2 = func() extensions.ReplicaSetCondition { - return extensions.ReplicaSetCondition{ - Type: extensions.ReplicaSetReplicaFailure, + condReplicaFailure2 = func() apps.ReplicaSetCondition { + return apps.ReplicaSetCondition{ + Type: apps.ReplicaSetReplicaFailure, Status: v1.ConditionTrue, Reason: "AnotherFailure", } } - status = func() *extensions.ReplicaSetStatus { - return &extensions.ReplicaSetStatus{ - Conditions: []extensions.ReplicaSetCondition{condReplicaFailure()}, + status = func() *apps.ReplicaSetStatus { + return &apps.ReplicaSetStatus{ + Conditions: []apps.ReplicaSetCondition{condReplicaFailure()}, } } ) @@ -1248,8 +1248,8 @@ func TestGetCondition(t *testing.T) { tests := []struct { name string - status extensions.ReplicaSetStatus - condType extensions.ReplicaSetConditionType + status apps.ReplicaSetStatus + condType apps.ReplicaSetConditionType condStatus v1.ConditionStatus condReason string @@ -1259,7 +1259,7 @@ func TestGetCondition(t *testing.T) { name: "condition exists", status: *exampleStatus, - condType: extensions.ReplicaSetReplicaFailure, + condType: apps.ReplicaSetReplicaFailure, expected: true, }, @@ -1286,34 +1286,34 @@ func TestSetCondition(t *testing.T) { tests := []struct { name string - status *extensions.ReplicaSetStatus - cond extensions.ReplicaSetCondition + status *apps.ReplicaSetStatus + cond apps.ReplicaSetCondition - expectedStatus *extensions.ReplicaSetStatus + expectedStatus *apps.ReplicaSetStatus }{ { name: "set for the first time", - status: &extensions.ReplicaSetStatus{}, + status: &apps.ReplicaSetStatus{}, cond: condReplicaFailure(), - expectedStatus: &extensions.ReplicaSetStatus{Conditions: []extensions.ReplicaSetCondition{condReplicaFailure()}}, + expectedStatus: &apps.ReplicaSetStatus{Conditions: []apps.ReplicaSetCondition{condReplicaFailure()}}, }, { name: "simple set", - status: &extensions.ReplicaSetStatus{Conditions: []extensions.ReplicaSetCondition{condImagePullBackOff()}}, + status: &apps.ReplicaSetStatus{Conditions: []apps.ReplicaSetCondition{condImagePullBackOff()}}, cond: condReplicaFailure(), - expectedStatus: &extensions.ReplicaSetStatus{Conditions: []extensions.ReplicaSetCondition{condImagePullBackOff(), condReplicaFailure()}}, + expectedStatus: &apps.ReplicaSetStatus{Conditions: []apps.ReplicaSetCondition{condImagePullBackOff(), condReplicaFailure()}}, }, { name: "overwrite", - status: &extensions.ReplicaSetStatus{Conditions: []extensions.ReplicaSetCondition{condReplicaFailure()}}, + status: &apps.ReplicaSetStatus{Conditions: []apps.ReplicaSetCondition{condReplicaFailure()}}, cond: condReplicaFailure2(), - expectedStatus: &extensions.ReplicaSetStatus{Conditions: []extensions.ReplicaSetCondition{condReplicaFailure2()}}, + expectedStatus: &apps.ReplicaSetStatus{Conditions: []apps.ReplicaSetCondition{condReplicaFailure2()}}, }, } @@ -1329,26 +1329,26 @@ func TestRemoveCondition(t *testing.T) { tests := []struct { name string - status *extensions.ReplicaSetStatus - condType extensions.ReplicaSetConditionType + status *apps.ReplicaSetStatus + condType apps.ReplicaSetConditionType - expectedStatus *extensions.ReplicaSetStatus + expectedStatus *apps.ReplicaSetStatus }{ { name: "remove from empty status", - status: &extensions.ReplicaSetStatus{}, - condType: extensions.ReplicaSetReplicaFailure, + status: &apps.ReplicaSetStatus{}, + condType: apps.ReplicaSetReplicaFailure, - expectedStatus: &extensions.ReplicaSetStatus{}, + expectedStatus: &apps.ReplicaSetStatus{}, }, { name: "simple remove", - status: &extensions.ReplicaSetStatus{Conditions: []extensions.ReplicaSetCondition{condReplicaFailure()}}, - condType: extensions.ReplicaSetReplicaFailure, + status: &apps.ReplicaSetStatus{Conditions: []apps.ReplicaSetCondition{condReplicaFailure()}}, + condType: apps.ReplicaSetReplicaFailure, - expectedStatus: &extensions.ReplicaSetStatus{}, + expectedStatus: &apps.ReplicaSetStatus{}, }, { name: "doesn't remove anything", diff --git a/pkg/controller/replicaset/replica_set_utils.go b/pkg/controller/replicaset/replica_set_utils.go index ad628da9551..de915e522a3 100644 --- a/pkg/controller/replicaset/replica_set_utils.go +++ b/pkg/controller/replicaset/replica_set_utils.go @@ -24,16 +24,16 @@ import ( "github.com/golang/glog" + apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" - extensions "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" - unversionedextensions "k8s.io/client-go/kubernetes/typed/extensions/v1beta1" + appsclient "k8s.io/client-go/kubernetes/typed/apps/v1" podutil "k8s.io/kubernetes/pkg/api/v1/pod" ) // updateReplicaSetStatus attempts to update the Status.Replicas of the given ReplicaSet, with a single GET/PUT retry. -func updateReplicaSetStatus(c unversionedextensions.ReplicaSetInterface, rs *extensions.ReplicaSet, newStatus extensions.ReplicaSetStatus) (*extensions.ReplicaSet, error) { +func updateReplicaSetStatus(c appsclient.ReplicaSetInterface, rs *apps.ReplicaSet, newStatus apps.ReplicaSetStatus) (*apps.ReplicaSet, error) { // This is the steady state. It happens when the ReplicaSet doesn't have any expectations, since // we do a periodic relist every 30s. If the generations differ but the replicas are // the same, a caller might've resized to the same replica count. @@ -53,7 +53,7 @@ func updateReplicaSetStatus(c unversionedextensions.ReplicaSetInterface, rs *ext newStatus.ObservedGeneration = rs.Generation var getErr, updateErr error - var updatedRS *extensions.ReplicaSet + var updatedRS *apps.ReplicaSet for i, rs := 0, rs; ; i++ { glog.V(4).Infof(fmt.Sprintf("Updating status for %v: %s/%s, ", rs.Kind, rs.Namespace, rs.Name) + fmt.Sprintf("replicas %d->%d (need %d), ", rs.Status.Replicas, newStatus.Replicas, *(rs.Spec.Replicas)) + @@ -82,7 +82,7 @@ func updateReplicaSetStatus(c unversionedextensions.ReplicaSetInterface, rs *ext return nil, updateErr } -func calculateStatus(rs *extensions.ReplicaSet, filteredPods []*v1.Pod, manageReplicasErr error) extensions.ReplicaSetStatus { +func calculateStatus(rs *apps.ReplicaSet, filteredPods []*v1.Pod, manageReplicasErr error) apps.ReplicaSetStatus { newStatus := rs.Status // Count the number of pods that have labels matching the labels of the pod // template of the replica set, the matching pods may have more @@ -105,7 +105,7 @@ func calculateStatus(rs *extensions.ReplicaSet, filteredPods []*v1.Pod, manageRe } } - failureCond := GetCondition(rs.Status, extensions.ReplicaSetReplicaFailure) + failureCond := GetCondition(rs.Status, apps.ReplicaSetReplicaFailure) if manageReplicasErr != nil && failureCond == nil { var reason string if diff := len(filteredPods) - int(*(rs.Spec.Replicas)); diff < 0 { @@ -113,10 +113,10 @@ func calculateStatus(rs *extensions.ReplicaSet, filteredPods []*v1.Pod, manageRe } else if diff > 0 { reason = "FailedDelete" } - cond := NewReplicaSetCondition(extensions.ReplicaSetReplicaFailure, v1.ConditionTrue, reason, manageReplicasErr.Error()) + cond := NewReplicaSetCondition(apps.ReplicaSetReplicaFailure, v1.ConditionTrue, reason, manageReplicasErr.Error()) SetCondition(&newStatus, cond) } else if manageReplicasErr == nil && failureCond != nil { - RemoveCondition(&newStatus, extensions.ReplicaSetReplicaFailure) + RemoveCondition(&newStatus, apps.ReplicaSetReplicaFailure) } newStatus.Replicas = int32(len(filteredPods)) @@ -127,8 +127,8 @@ func calculateStatus(rs *extensions.ReplicaSet, filteredPods []*v1.Pod, manageRe } // NewReplicaSetCondition creates a new replicaset condition. -func NewReplicaSetCondition(condType extensions.ReplicaSetConditionType, status v1.ConditionStatus, reason, msg string) extensions.ReplicaSetCondition { - return extensions.ReplicaSetCondition{ +func NewReplicaSetCondition(condType apps.ReplicaSetConditionType, status v1.ConditionStatus, reason, msg string) apps.ReplicaSetCondition { + return apps.ReplicaSetCondition{ Type: condType, Status: status, LastTransitionTime: metav1.Now(), @@ -138,7 +138,7 @@ func NewReplicaSetCondition(condType extensions.ReplicaSetConditionType, status } // GetCondition returns a replicaset condition with the provided type if it exists. -func GetCondition(status extensions.ReplicaSetStatus, condType extensions.ReplicaSetConditionType) *extensions.ReplicaSetCondition { +func GetCondition(status apps.ReplicaSetStatus, condType apps.ReplicaSetConditionType) *apps.ReplicaSetCondition { for _, c := range status.Conditions { if c.Type == condType { return &c @@ -149,7 +149,7 @@ func GetCondition(status extensions.ReplicaSetStatus, condType extensions.Replic // SetCondition adds/replaces the given condition in the replicaset status. If the condition that we // are about to add already exists and has the same status and reason then we are not going to update. -func SetCondition(status *extensions.ReplicaSetStatus, condition extensions.ReplicaSetCondition) { +func SetCondition(status *apps.ReplicaSetStatus, condition apps.ReplicaSetCondition) { currentCond := GetCondition(*status, condition.Type) if currentCond != nil && currentCond.Status == condition.Status && currentCond.Reason == condition.Reason { return @@ -159,13 +159,13 @@ func SetCondition(status *extensions.ReplicaSetStatus, condition extensions.Repl } // RemoveCondition removes the condition with the provided type from the replicaset status. -func RemoveCondition(status *extensions.ReplicaSetStatus, condType extensions.ReplicaSetConditionType) { +func RemoveCondition(status *apps.ReplicaSetStatus, condType apps.ReplicaSetConditionType) { status.Conditions = filterOutCondition(status.Conditions, condType) } // filterOutCondition returns a new slice of replicaset conditions without conditions with the provided type. -func filterOutCondition(conditions []extensions.ReplicaSetCondition, condType extensions.ReplicaSetConditionType) []extensions.ReplicaSetCondition { - var newConditions []extensions.ReplicaSetCondition +func filterOutCondition(conditions []apps.ReplicaSetCondition, condType apps.ReplicaSetConditionType) []apps.ReplicaSetCondition { + var newConditions []apps.ReplicaSetCondition for _, c := range conditions { if c.Type == condType { continue diff --git a/pkg/controller/replicaset/replica_set_utils_test.go b/pkg/controller/replicaset/replica_set_utils_test.go index fbde4d0b40a..6f65315e77f 100644 --- a/pkg/controller/replicaset/replica_set_utils_test.go +++ b/pkg/controller/replicaset/replica_set_utils_test.go @@ -23,8 +23,8 @@ import ( "reflect" "testing" + apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" - extensions "k8s.io/api/extensions/v1beta1" ) func TestCalculateStatus(t *testing.T) { @@ -38,9 +38,9 @@ func TestCalculateStatus(t *testing.T) { rsStatusTests := []struct { name string - replicaset *extensions.ReplicaSet + replicaset *apps.ReplicaSet filteredPods []*v1.Pod - expectedReplicaSetStatus extensions.ReplicaSetStatus + expectedReplicaSetStatus apps.ReplicaSetStatus }{ { "1 fully labelled pod", @@ -48,7 +48,7 @@ func TestCalculateStatus(t *testing.T) { []*v1.Pod{ newPod("pod1", fullyLabelledRS, v1.PodRunning, nil, true), }, - extensions.ReplicaSetStatus{ + apps.ReplicaSetStatus{ Replicas: 1, FullyLabeledReplicas: 1, ReadyReplicas: 1, @@ -61,7 +61,7 @@ func TestCalculateStatus(t *testing.T) { []*v1.Pod{ newPod("pod1", notFullyLabelledRS, v1.PodRunning, nil, true), }, - extensions.ReplicaSetStatus{ + apps.ReplicaSetStatus{ Replicas: 1, FullyLabeledReplicas: 0, ReadyReplicas: 1, @@ -75,7 +75,7 @@ func TestCalculateStatus(t *testing.T) { newPod("pod1", fullyLabelledRS, v1.PodRunning, nil, true), newPod("pod2", fullyLabelledRS, v1.PodRunning, nil, true), }, - extensions.ReplicaSetStatus{ + apps.ReplicaSetStatus{ Replicas: 2, FullyLabeledReplicas: 2, ReadyReplicas: 2, @@ -89,7 +89,7 @@ func TestCalculateStatus(t *testing.T) { newPod("pod1", notFullyLabelledRS, v1.PodRunning, nil, true), newPod("pod2", notFullyLabelledRS, v1.PodRunning, nil, true), }, - extensions.ReplicaSetStatus{ + apps.ReplicaSetStatus{ Replicas: 2, FullyLabeledReplicas: 0, ReadyReplicas: 2, @@ -103,7 +103,7 @@ func TestCalculateStatus(t *testing.T) { newPod("pod1", notFullyLabelledRS, v1.PodRunning, nil, true), newPod("pod2", fullyLabelledRS, v1.PodRunning, nil, true), }, - extensions.ReplicaSetStatus{ + apps.ReplicaSetStatus{ Replicas: 2, FullyLabeledReplicas: 1, ReadyReplicas: 2, @@ -116,7 +116,7 @@ func TestCalculateStatus(t *testing.T) { []*v1.Pod{ newPod("pod1", fullyLabelledRS, v1.PodPending, nil, true), }, - extensions.ReplicaSetStatus{ + apps.ReplicaSetStatus{ Replicas: 1, FullyLabeledReplicas: 1, ReadyReplicas: 0, @@ -129,7 +129,7 @@ func TestCalculateStatus(t *testing.T) { []*v1.Pod{ newPod("pod1", longMinReadySecondsRS, v1.PodRunning, nil, true), }, - extensions.ReplicaSetStatus{ + apps.ReplicaSetStatus{ Replicas: 1, FullyLabeledReplicas: 1, ReadyReplicas: 1, @@ -150,19 +150,19 @@ func TestCalculateStatusConditions(t *testing.T) { labelMap := map[string]string{"name": "foo"} rs := newReplicaSet(2, labelMap) replicaFailureRS := newReplicaSet(10, labelMap) - replicaFailureRS.Status.Conditions = []extensions.ReplicaSetCondition{ + replicaFailureRS.Status.Conditions = []apps.ReplicaSetCondition{ { - Type: extensions.ReplicaSetReplicaFailure, + Type: apps.ReplicaSetReplicaFailure, Status: v1.ConditionTrue, }, } rsStatusConditionTests := []struct { name string - replicaset *extensions.ReplicaSet + replicaset *apps.ReplicaSet filteredPods []*v1.Pod manageReplicasErr error - expectedReplicaSetConditions []extensions.ReplicaSetCondition + expectedReplicaSetConditions []apps.ReplicaSetCondition }{ { @@ -172,9 +172,9 @@ func TestCalculateStatusConditions(t *testing.T) { newPod("pod1", rs, v1.PodRunning, nil, true), }, fmt.Errorf("fake manageReplicasErr"), - []extensions.ReplicaSetCondition{ + []apps.ReplicaSetCondition{ { - Type: extensions.ReplicaSetReplicaFailure, + Type: apps.ReplicaSetReplicaFailure, Status: v1.ConditionTrue, Reason: "FailedCreate", Message: "fake manageReplicasErr", @@ -190,9 +190,9 @@ func TestCalculateStatusConditions(t *testing.T) { newPod("pod3", rs, v1.PodRunning, nil, true), }, fmt.Errorf("fake manageReplicasErr"), - []extensions.ReplicaSetCondition{ + []apps.ReplicaSetCondition{ { - Type: extensions.ReplicaSetReplicaFailure, + Type: apps.ReplicaSetReplicaFailure, Status: v1.ConditionTrue, Reason: "FailedDelete", Message: "fake manageReplicasErr", @@ -215,9 +215,9 @@ func TestCalculateStatusConditions(t *testing.T) { newPod("pod1", replicaFailureRS, v1.PodRunning, nil, true), }, fmt.Errorf("fake manageReplicasErr"), - []extensions.ReplicaSetCondition{ + []apps.ReplicaSetCondition{ { - Type: extensions.ReplicaSetReplicaFailure, + Type: apps.ReplicaSetReplicaFailure, Status: v1.ConditionTrue, }, }, From f3799fae36c9d25a22363842e1d82bfe4b1d2fb1 Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Mon, 19 Mar 2018 13:32:08 -0700 Subject: [PATCH 2/6] ReplicationController: Use apps/v1 ReplicaSet in conversion layer. --- pkg/controller/replication/conversion.go | 104 +++++++---------------- 1 file changed, 32 insertions(+), 72 deletions(-) diff --git a/pkg/controller/replication/conversion.go b/pkg/controller/replication/conversion.go index 044c1b24081..ff7f4b6f7a3 100644 --- a/pkg/controller/replication/conversion.go +++ b/pkg/controller/replication/conversion.go @@ -26,8 +26,8 @@ import ( "fmt" "time" + apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" - extensionsv1beta1 "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -36,16 +36,14 @@ import ( "k8s.io/apimachinery/pkg/watch" coreinformers "k8s.io/client-go/informers/core/v1" clientset "k8s.io/client-go/kubernetes" - appsv1 "k8s.io/client-go/kubernetes/typed/apps/v1" - appsv1beta2 "k8s.io/client-go/kubernetes/typed/apps/v1beta2" + appsv1client "k8s.io/client-go/kubernetes/typed/apps/v1" v1client "k8s.io/client-go/kubernetes/typed/core/v1" - extensionsv1beta1client "k8s.io/client-go/kubernetes/typed/extensions/v1beta1" + appslisters "k8s.io/client-go/listers/apps/v1" v1listers "k8s.io/client-go/listers/core/v1" - extensionslisters "k8s.io/client-go/listers/extensions/v1beta1" "k8s.io/client-go/tools/cache" + appsconversion "k8s.io/kubernetes/pkg/apis/apps/v1" apiv1 "k8s.io/kubernetes/pkg/apis/core/v1" "k8s.io/kubernetes/pkg/apis/extensions" - extensionsinternalv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" "k8s.io/kubernetes/pkg/controller" ) @@ -59,7 +57,7 @@ func (i informerAdapter) Informer() cache.SharedIndexInformer { return conversionInformer{i.rcInformer.Informer()} } -func (i informerAdapter) Lister() extensionslisters.ReplicaSetLister { +func (i informerAdapter) Lister() appslisters.ReplicaSetLister { return conversionLister{i.rcInformer.Lister()} } @@ -79,7 +77,7 @@ type conversionLister struct { rcLister v1listers.ReplicationControllerLister } -func (l conversionLister) List(selector labels.Selector) ([]*extensionsv1beta1.ReplicaSet, error) { +func (l conversionLister) List(selector labels.Selector) ([]*apps.ReplicaSet, error) { rcList, err := l.rcLister.List(selector) if err != nil { return nil, err @@ -87,11 +85,11 @@ func (l conversionLister) List(selector labels.Selector) ([]*extensionsv1beta1.R return convertSlice(rcList) } -func (l conversionLister) ReplicaSets(namespace string) extensionslisters.ReplicaSetNamespaceLister { +func (l conversionLister) ReplicaSets(namespace string) appslisters.ReplicaSetNamespaceLister { return conversionNamespaceLister{l.rcLister.ReplicationControllers(namespace)} } -func (l conversionLister) GetPodReplicaSets(pod *v1.Pod) ([]*extensionsv1beta1.ReplicaSet, error) { +func (l conversionLister) GetPodReplicaSets(pod *v1.Pod) ([]*apps.ReplicaSet, error) { rcList, err := l.rcLister.GetPodControllers(pod) if err != nil { return nil, err @@ -103,7 +101,7 @@ type conversionNamespaceLister struct { rcLister v1listers.ReplicationControllerNamespaceLister } -func (l conversionNamespaceLister) List(selector labels.Selector) ([]*extensionsv1beta1.ReplicaSet, error) { +func (l conversionNamespaceLister) List(selector labels.Selector) ([]*apps.ReplicaSet, error) { rcList, err := l.rcLister.List(selector) if err != nil { return nil, err @@ -111,7 +109,7 @@ func (l conversionNamespaceLister) List(selector labels.Selector) ([]*extensions return convertSlice(rcList) } -func (l conversionNamespaceLister) Get(name string) (*extensionsv1beta1.ReplicaSet, error) { +func (l conversionNamespaceLister) Get(name string) (*apps.ReplicaSet, error) { rc, err := l.rcLister.Get(name) if err != nil { return nil, err @@ -182,58 +180,20 @@ type clientsetAdapter struct { clientset.Interface } -func (c clientsetAdapter) ExtensionsV1beta1() extensionsv1beta1client.ExtensionsV1beta1Interface { - return conversionExtensionsClient{c.Interface, c.Interface.ExtensionsV1beta1()} -} - -func (c clientsetAdapter) Extensions() extensionsv1beta1client.ExtensionsV1beta1Interface { - return conversionExtensionsClient{c.Interface, c.Interface.ExtensionsV1beta1()} -} - -func (c clientsetAdapter) AppsV1beta2() appsv1beta2.AppsV1beta2Interface { - return conversionAppsV1beta2Client{c.Interface, c.Interface.AppsV1beta2()} -} - -func (c clientsetAdapter) AppsV1() appsv1.AppsV1Interface { +func (c clientsetAdapter) AppsV1() appsv1client.AppsV1Interface { return conversionAppsV1Client{c.Interface, c.Interface.AppsV1()} } -func (c clientsetAdapter) Apps() appsv1.AppsV1Interface { +func (c clientsetAdapter) Apps() appsv1client.AppsV1Interface { return conversionAppsV1Client{c.Interface, c.Interface.AppsV1()} } -type conversionAppsV1beta2Client struct { - clientset clientset.Interface - appsv1beta2.AppsV1beta2Interface -} - -func (c conversionAppsV1beta2Client) ReplicaSets(namespace string) appsv1beta2.ReplicaSetInterface { - // TODO(enisoc): This will force RC integration tests to fail if anyone tries to update - // ReplicaSetController to use apps/v1beta2 without updating this conversion adapter. - // Please change conversionClient to use the new RS version instead of extensions/v1beta1, - // and then return a conversionClient here. - panic("need to update RC/RS conversionClient for apps/v1beta2") -} - type conversionAppsV1Client struct { clientset clientset.Interface - appsv1.AppsV1Interface + appsv1client.AppsV1Interface } -func (c conversionAppsV1Client) ReplicaSets(namespace string) appsv1.ReplicaSetInterface { - // TODO(enisoc): This will force RC integration tests to fail if anyone tries to update - // ReplicaSetController to use apps/v1 without updating this conversion adapter. - // Please change conversionClient to use the new RS version instead of extensions/v1beta1, - // and then return a conversionClient here. - panic("need to update RC/RS conversionClient for apps/v1") -} - -type conversionExtensionsClient struct { - clientset clientset.Interface - extensionsv1beta1client.ExtensionsV1beta1Interface -} - -func (c conversionExtensionsClient) ReplicaSets(namespace string) extensionsv1beta1client.ReplicaSetInterface { +func (c conversionAppsV1Client) ReplicaSets(namespace string) appsv1client.ReplicaSetInterface { return conversionClient{c.clientset.CoreV1().ReplicationControllers(namespace)} } @@ -241,19 +201,19 @@ type conversionClient struct { v1client.ReplicationControllerInterface } -func (c conversionClient) Create(rs *extensionsv1beta1.ReplicaSet) (*extensionsv1beta1.ReplicaSet, error) { +func (c conversionClient) Create(rs *apps.ReplicaSet) (*apps.ReplicaSet, error) { return convertCall(c.ReplicationControllerInterface.Create, rs) } -func (c conversionClient) Update(rs *extensionsv1beta1.ReplicaSet) (*extensionsv1beta1.ReplicaSet, error) { +func (c conversionClient) Update(rs *apps.ReplicaSet) (*apps.ReplicaSet, error) { return convertCall(c.ReplicationControllerInterface.Update, rs) } -func (c conversionClient) UpdateStatus(rs *extensionsv1beta1.ReplicaSet) (*extensionsv1beta1.ReplicaSet, error) { +func (c conversionClient) UpdateStatus(rs *apps.ReplicaSet) (*apps.ReplicaSet, error) { return convertCall(c.ReplicationControllerInterface.UpdateStatus, rs) } -func (c conversionClient) Get(name string, options metav1.GetOptions) (*extensionsv1beta1.ReplicaSet, error) { +func (c conversionClient) Get(name string, options metav1.GetOptions) (*apps.ReplicaSet, error) { rc, err := c.ReplicationControllerInterface.Get(name, options) if err != nil { return nil, err @@ -261,7 +221,7 @@ func (c conversionClient) Get(name string, options metav1.GetOptions) (*extensio return convertRCtoRS(rc, nil) } -func (c conversionClient) List(opts metav1.ListOptions) (*extensionsv1beta1.ReplicaSetList, error) { +func (c conversionClient) List(opts metav1.ListOptions) (*apps.ReplicaSetList, error) { rcList, err := c.ReplicationControllerInterface.List(opts) if err != nil { return nil, err @@ -274,13 +234,13 @@ func (c conversionClient) Watch(opts metav1.ListOptions) (watch.Interface, error return nil, errors.New("Watch() is not implemented for conversionClient") } -func (c conversionClient) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *extensionsv1beta1.ReplicaSet, err error) { +func (c conversionClient) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *apps.ReplicaSet, err error) { // This is not used by RSC. return nil, errors.New("Patch() is not implemented for conversionClient") } -func convertSlice(rcList []*v1.ReplicationController) ([]*extensionsv1beta1.ReplicaSet, error) { - rsList := make([]*extensionsv1beta1.ReplicaSet, 0, len(rcList)) +func convertSlice(rcList []*v1.ReplicationController) ([]*apps.ReplicaSet, error) { + rsList := make([]*apps.ReplicaSet, 0, len(rcList)) for _, rc := range rcList { rs, err := convertRCtoRS(rc, nil) if err != nil { @@ -291,8 +251,8 @@ func convertSlice(rcList []*v1.ReplicationController) ([]*extensionsv1beta1.Repl return rsList, nil } -func convertList(rcList *v1.ReplicationControllerList) (*extensionsv1beta1.ReplicaSetList, error) { - rsList := &extensionsv1beta1.ReplicaSetList{Items: make([]extensionsv1beta1.ReplicaSet, len(rcList.Items))} +func convertList(rcList *v1.ReplicationControllerList) (*apps.ReplicaSetList, error) { + rsList := &apps.ReplicaSetList{Items: make([]apps.ReplicaSet, len(rcList.Items))} for i := range rcList.Items { rc := &rcList.Items[i] _, err := convertRCtoRS(rc, &rsList.Items[i]) @@ -303,7 +263,7 @@ func convertList(rcList *v1.ReplicationControllerList) (*extensionsv1beta1.Repli return rsList, nil } -func convertCall(fn func(*v1.ReplicationController) (*v1.ReplicationController, error), rs *extensionsv1beta1.ReplicaSet) (*extensionsv1beta1.ReplicaSet, error) { +func convertCall(fn func(*v1.ReplicationController) (*v1.ReplicationController, error), rs *apps.ReplicaSet) (*apps.ReplicaSet, error) { rc, err := convertRStoRC(rs) if err != nil { return nil, err @@ -315,23 +275,23 @@ func convertCall(fn func(*v1.ReplicationController) (*v1.ReplicationController, return convertRCtoRS(result, nil) } -func convertRCtoRS(rc *v1.ReplicationController, out *extensionsv1beta1.ReplicaSet) (*extensionsv1beta1.ReplicaSet, error) { +func convertRCtoRS(rc *v1.ReplicationController, out *apps.ReplicaSet) (*apps.ReplicaSet, error) { var rsInternal extensions.ReplicaSet if err := apiv1.Convert_v1_ReplicationController_to_extensions_ReplicaSet(rc, &rsInternal, nil); err != nil { return nil, fmt.Errorf("can't convert ReplicationController %v/%v to ReplicaSet: %v", rc.Namespace, rc.Name, err) } if out == nil { - out = new(extensionsv1beta1.ReplicaSet) + out = new(apps.ReplicaSet) } - if err := extensionsinternalv1beta1.Convert_extensions_ReplicaSet_To_v1beta1_ReplicaSet(&rsInternal, out, nil); err != nil { + if err := appsconversion.Convert_extensions_ReplicaSet_To_v1_ReplicaSet(&rsInternal, out, nil); err != nil { return nil, fmt.Errorf("can't convert ReplicaSet (converted from ReplicationController %v/%v) from internal to extensions/v1beta1: %v", rc.Namespace, rc.Name, err) } return out, nil } -func convertRStoRC(rs *extensionsv1beta1.ReplicaSet) (*v1.ReplicationController, error) { +func convertRStoRC(rs *apps.ReplicaSet) (*v1.ReplicationController, error) { var rsInternal extensions.ReplicaSet - if err := extensionsinternalv1beta1.Convert_v1beta1_ReplicaSet_To_extensions_ReplicaSet(rs, &rsInternal, nil); err != nil { + if err := appsconversion.Convert_v1_ReplicaSet_To_extensions_ReplicaSet(rs, &rsInternal, nil); err != nil { return nil, fmt.Errorf("can't convert ReplicaSet (converting to ReplicationController %v/%v) from extensions/v1beta1 to internal: %v", rs.Namespace, rs.Name, err) } var rc v1.ReplicationController @@ -356,7 +316,7 @@ func (pc podControlAdapter) CreatePodsOnNode(nodeName, namespace string, templat } func (pc podControlAdapter) CreatePodsWithControllerRef(namespace string, template *v1.PodTemplateSpec, object runtime.Object, controllerRef *metav1.OwnerReference) error { - rc, err := convertRStoRC(object.(*extensionsv1beta1.ReplicaSet)) + rc, err := convertRStoRC(object.(*apps.ReplicaSet)) if err != nil { return err } @@ -364,7 +324,7 @@ func (pc podControlAdapter) CreatePodsWithControllerRef(namespace string, templa } func (pc podControlAdapter) DeletePod(namespace string, podID string, object runtime.Object) error { - rc, err := convertRStoRC(object.(*extensionsv1beta1.ReplicaSet)) + rc, err := convertRStoRC(object.(*apps.ReplicaSet)) if err != nil { return err } From bb407944eeb87e1921ccbd5620568bd173d7379c Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Mon, 19 Mar 2018 13:38:25 -0700 Subject: [PATCH 3/6] ReplicaSet: Use apps/v1 RS in kube-controller-manager. --- cmd/kube-controller-manager/app/apps.go | 14 ++++++++++++++ cmd/kube-controller-manager/app/extensions.go | 14 -------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/cmd/kube-controller-manager/app/apps.go b/cmd/kube-controller-manager/app/apps.go index 57898b5fcec..4994b0541f7 100644 --- a/cmd/kube-controller-manager/app/apps.go +++ b/cmd/kube-controller-manager/app/apps.go @@ -25,6 +25,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/kubernetes/pkg/controller/daemon" + "k8s.io/kubernetes/pkg/controller/replicaset" "k8s.io/kubernetes/pkg/controller/statefulset" ) @@ -59,3 +60,16 @@ func startStatefulSetController(ctx ControllerContext) (bool, error) { ).Run(1, ctx.Stop) return true, nil } + +func startReplicaSetController(ctx ControllerContext) (bool, error) { + if !ctx.AvailableResources[schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "replicasets"}] { + return false, nil + } + go replicaset.NewReplicaSetController( + ctx.InformerFactory.Apps().V1().ReplicaSets(), + ctx.InformerFactory.Core().V1().Pods(), + ctx.ClientBuilder.ClientOrDie("replicaset-controller"), + replicaset.BurstReplicas, + ).Run(int(ctx.ComponentConfig.ConcurrentRSSyncs), ctx.Stop) + return true, nil +} diff --git a/cmd/kube-controller-manager/app/extensions.go b/cmd/kube-controller-manager/app/extensions.go index 2c30fde86b8..fe2133f58e3 100644 --- a/cmd/kube-controller-manager/app/extensions.go +++ b/cmd/kube-controller-manager/app/extensions.go @@ -25,7 +25,6 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/kubernetes/pkg/controller/deployment" - "k8s.io/kubernetes/pkg/controller/replicaset" ) func startDeploymentController(ctx ControllerContext) (bool, error) { @@ -44,16 +43,3 @@ func startDeploymentController(ctx ControllerContext) (bool, error) { go dc.Run(int(ctx.ComponentConfig.ConcurrentDeploymentSyncs), ctx.Stop) return true, nil } - -func startReplicaSetController(ctx ControllerContext) (bool, error) { - if !ctx.AvailableResources[schema.GroupVersionResource{Group: "extensions", Version: "v1beta1", Resource: "replicasets"}] { - return false, nil - } - go replicaset.NewReplicaSetController( - ctx.InformerFactory.Extensions().V1beta1().ReplicaSets(), - ctx.InformerFactory.Core().V1().Pods(), - ctx.ClientBuilder.ClientOrDie("replicaset-controller"), - replicaset.BurstReplicas, - ).Run(int(ctx.ComponentConfig.ConcurrentRSSyncs), ctx.Stop) - return true, nil -} From b27836032ac99460df4c19d53b2551ad25163900 Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Mon, 19 Mar 2018 14:09:54 -0700 Subject: [PATCH 4/6] ReplicaSet: Use apps/v1 RS in e2e test. --- test/e2e/apps/deployment.go | 6 +-- test/e2e/apps/replica_set.go | 49 +++++++++++++++---- test/e2e/framework/rs_util.go | 9 ++-- test/e2e/upgrades/apps/replicasets.go | 8 +-- test/integration/deployment/util.go | 10 ++-- .../integration/replicaset/replicaset_test.go | 2 +- test/utils/replicaset.go | 34 +++++++++++-- 7 files changed, 89 insertions(+), 29 deletions(-) diff --git a/test/e2e/apps/deployment.go b/test/e2e/apps/deployment.go index 74743de98bc..07f011afcdb 100644 --- a/test/e2e/apps/deployment.go +++ b/test/e2e/apps/deployment.go @@ -242,7 +242,7 @@ func testRollingUpdateDeployment(f *framework.Framework) { rsRevision := "3546343826724305832" annotations := make(map[string]string) annotations[deploymentutil.RevisionAnnotation] = rsRevision - rs := newRS(rsName, replicas, rsPodLabels, NginxImageName, NginxImage) + rs := newExtensionsRS(rsName, replicas, rsPodLabels, NginxImageName, NginxImage) rs.Annotations = annotations framework.Logf("Creating replica set %q (going to be adopted)", rs.Name) _, err := c.ExtensionsV1beta1().ReplicaSets(ns).Create(rs) @@ -324,7 +324,7 @@ func testDeploymentCleanUpPolicy(f *framework.Framework) { rsName := "test-cleanup-controller" replicas := int32(1) revisionHistoryLimit := utilpointer.Int32Ptr(0) - _, err := c.ExtensionsV1beta1().ReplicaSets(ns).Create(newRS(rsName, replicas, rsPodLabels, NginxImageName, NginxImage)) + _, err := c.ExtensionsV1beta1().ReplicaSets(ns).Create(newExtensionsRS(rsName, replicas, rsPodLabels, NginxImageName, NginxImage)) Expect(err).NotTo(HaveOccurred()) // Verify that the required pods have come up. @@ -395,7 +395,7 @@ func testRolloverDeployment(f *framework.Framework) { rsName := "test-rollover-controller" rsReplicas := int32(1) - _, err := c.ExtensionsV1beta1().ReplicaSets(ns).Create(newRS(rsName, rsReplicas, rsPodLabels, NginxImageName, NginxImage)) + _, err := c.ExtensionsV1beta1().ReplicaSets(ns).Create(newExtensionsRS(rsName, rsReplicas, rsPodLabels, NginxImageName, NginxImage)) Expect(err).NotTo(HaveOccurred()) // Verify that the required pods have come up. err = framework.VerifyPodsRunning(c, ns, podName, false, rsReplicas) diff --git a/test/e2e/apps/replica_set.go b/test/e2e/apps/replica_set.go index 8dcd4abed84..addff806e8a 100644 --- a/test/e2e/apps/replica_set.go +++ b/test/e2e/apps/replica_set.go @@ -20,6 +20,7 @@ import ( "fmt" "time" + apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" extensions "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/api/errors" @@ -36,7 +37,37 @@ import ( imageutils "k8s.io/kubernetes/test/utils/image" ) -func newRS(rsName string, replicas int32, rsPodLabels map[string]string, imageName string, image string) *extensions.ReplicaSet { +func newRS(rsName string, replicas int32, rsPodLabels map[string]string, imageName string, image string) *apps.ReplicaSet { + zero := int64(0) + return &apps.ReplicaSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: rsName, + }, + Spec: apps.ReplicaSetSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: rsPodLabels, + }, + Replicas: &replicas, + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: rsPodLabels, + }, + Spec: v1.PodSpec{ + TerminationGracePeriodSeconds: &zero, + Containers: []v1.Container{ + { + Name: imageName, + Image: image, + }, + }, + }, + }, + }, + } +} + +// TODO(#55714): Remove this when Deployment tests use apps/v1 ReplicaSet. +func newExtensionsRS(rsName string, replicas int32, rsPodLabels map[string]string, imageName string, image string) *extensions.ReplicaSet { zero := int64(0) return &extensions.ReplicaSet{ ObjectMeta: metav1.ObjectMeta{ @@ -111,7 +142,7 @@ func testReplicaSetServeImageOrFail(f *framework.Framework, test string, image s framework.Logf("Creating ReplicaSet %s", name) newRS := newRS(name, replicas, map[string]string{"name": name}, name, image) newRS.Spec.Template.Spec.Containers[0].Ports = []v1.ContainerPort{{ContainerPort: 9376}} - _, err := f.ClientSet.ExtensionsV1beta1().ReplicaSets(f.Namespace.Name).Create(newRS) + _, err := f.ClientSet.AppsV1().ReplicaSets(f.Namespace.Name).Create(newRS) Expect(err).NotTo(HaveOccurred()) // Check that pods for the new RS were created. @@ -187,14 +218,14 @@ func testReplicaSetConditionCheck(f *framework.Framework) { By(fmt.Sprintf("Creating replica set %q that asks for more than the allowed pod quota", name)) rs := newRS(name, 3, map[string]string{"name": name}, NginxImageName, NginxImage) - rs, err = c.ExtensionsV1beta1().ReplicaSets(namespace).Create(rs) + rs, err = c.AppsV1().ReplicaSets(namespace).Create(rs) Expect(err).NotTo(HaveOccurred()) By(fmt.Sprintf("Checking replica set %q has the desired failure condition set", name)) generation := rs.Generation conditions := rs.Status.Conditions err = wait.PollImmediate(1*time.Second, 1*time.Minute, func() (bool, error) { - rs, err = c.ExtensionsV1beta1().ReplicaSets(namespace).Get(name, metav1.GetOptions{}) + rs, err = c.AppsV1().ReplicaSets(namespace).Get(name, metav1.GetOptions{}) if err != nil { return false, err } @@ -204,7 +235,7 @@ func testReplicaSetConditionCheck(f *framework.Framework) { } conditions = rs.Status.Conditions - cond := replicaset.GetCondition(rs.Status, extensions.ReplicaSetReplicaFailure) + cond := replicaset.GetCondition(rs.Status, apps.ReplicaSetReplicaFailure) return cond != nil, nil }) @@ -214,7 +245,7 @@ func testReplicaSetConditionCheck(f *framework.Framework) { Expect(err).NotTo(HaveOccurred()) By(fmt.Sprintf("Scaling down replica set %q to satisfy pod quota", name)) - rs, err = framework.UpdateReplicaSetWithRetries(c, namespace, name, func(update *extensions.ReplicaSet) { + rs, err = framework.UpdateReplicaSetWithRetries(c, namespace, name, func(update *apps.ReplicaSet) { x := int32(2) update.Spec.Replicas = &x }) @@ -224,7 +255,7 @@ func testReplicaSetConditionCheck(f *framework.Framework) { generation = rs.Generation conditions = rs.Status.Conditions err = wait.PollImmediate(1*time.Second, 1*time.Minute, func() (bool, error) { - rs, err = c.ExtensionsV1beta1().ReplicaSets(namespace).Get(name, metav1.GetOptions{}) + rs, err = c.AppsV1().ReplicaSets(namespace).Get(name, metav1.GetOptions{}) if err != nil { return false, err } @@ -234,7 +265,7 @@ func testReplicaSetConditionCheck(f *framework.Framework) { } conditions = rs.Status.Conditions - cond := replicaset.GetCondition(rs.Status, extensions.ReplicaSetReplicaFailure) + cond := replicaset.GetCondition(rs.Status, apps.ReplicaSetReplicaFailure) return cond == nil, nil }) if err == wait.ErrWaitTimeout { @@ -267,7 +298,7 @@ func testRSAdoptMatchingAndReleaseNotMatching(f *framework.Framework) { replicas := int32(1) rsSt := newRS(name, replicas, map[string]string{"name": name}, name, NginxImageName) rsSt.Spec.Selector = &metav1.LabelSelector{MatchLabels: map[string]string{"name": name}} - rs, err := f.ClientSet.ExtensionsV1beta1().ReplicaSets(f.Namespace.Name).Create(rsSt) + rs, err := f.ClientSet.AppsV1().ReplicaSets(f.Namespace.Name).Create(rsSt) Expect(err).NotTo(HaveOccurred()) By("Then the orphan pod is adopted") diff --git a/test/e2e/framework/rs_util.go b/test/e2e/framework/rs_util.go index e0708b35d4d..d8ae052a7ed 100644 --- a/test/e2e/framework/rs_util.go +++ b/test/e2e/framework/rs_util.go @@ -21,6 +21,7 @@ import ( . "github.com/onsi/ginkgo" + apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" extensions "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -33,7 +34,7 @@ import ( type updateRsFunc func(d *extensions.ReplicaSet) -func UpdateReplicaSetWithRetries(c clientset.Interface, namespace, name string, applyUpdate testutils.UpdateReplicaSetFunc) (*extensions.ReplicaSet, error) { +func UpdateReplicaSetWithRetries(c clientset.Interface, namespace, name string, applyUpdate testutils.UpdateReplicaSetFunc) (*apps.ReplicaSet, error) { return testutils.UpdateReplicaSetWithRetries(c, namespace, name, applyUpdate, Logf, Poll, pollShortTimeout) } @@ -126,8 +127,8 @@ func RunReplicaSet(config testutils.ReplicaSetConfig) error { return testutils.RunReplicaSet(config) } -func NewReplicaSet(name, namespace string, replicas int32, podLabels map[string]string, imageName, image string) *extensions.ReplicaSet { - return &extensions.ReplicaSet{ +func NewReplicaSet(name, namespace string, replicas int32, podLabels map[string]string, imageName, image string) *apps.ReplicaSet { + return &apps.ReplicaSet{ TypeMeta: metav1.TypeMeta{ Kind: "ReplicaSet", APIVersion: "extensions/v1beta1", @@ -136,7 +137,7 @@ func NewReplicaSet(name, namespace string, replicas int32, podLabels map[string] Namespace: namespace, Name: name, }, - Spec: extensions.ReplicaSetSpec{ + Spec: apps.ReplicaSetSpec{ Selector: &metav1.LabelSelector{ MatchLabels: podLabels, }, diff --git a/test/e2e/upgrades/apps/replicasets.go b/test/e2e/upgrades/apps/replicasets.go index 88d46c2ae1e..4b3fd327d0c 100644 --- a/test/e2e/upgrades/apps/replicasets.go +++ b/test/e2e/upgrades/apps/replicasets.go @@ -20,7 +20,7 @@ import ( "fmt" "time" - extensions "k8s.io/api/extensions/v1beta1" + apps "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/test/e2e/framework" @@ -54,7 +54,7 @@ func (r *ReplicaSetUpgradeTest) Setup(f *framework.Framework) { By(fmt.Sprintf("Creating replicaset %s in namespace %s", rsName, ns)) replicaSet := framework.NewReplicaSet(rsName, ns, 1, map[string]string{"test": "upgrade"}, "nginx", nginxImage) - rs, err := c.ExtensionsV1beta1().ReplicaSets(ns).Create(replicaSet) + rs, err := c.AppsV1().ReplicaSets(ns).Create(replicaSet) framework.ExpectNoError(err) By(fmt.Sprintf("Waiting for replicaset %s to have all of its replicas ready", rsName)) @@ -67,7 +67,7 @@ func (r *ReplicaSetUpgradeTest) Setup(f *framework.Framework) { func (r *ReplicaSetUpgradeTest) Test(f *framework.Framework, done <-chan struct{}, upgrade upgrades.UpgradeType) { c := f.ClientSet ns := f.Namespace.Name - rsClient := c.ExtensionsV1beta1().ReplicaSets(ns) + rsClient := c.AppsV1().ReplicaSets(ns) // Block until upgrade is done By(fmt.Sprintf("Waiting for upgrade to finish before checking replicaset %s", rsName)) @@ -86,7 +86,7 @@ func (r *ReplicaSetUpgradeTest) Test(f *framework.Framework, done <-chan struct{ // Verify the upgraded RS is active by scaling up the RS to scaleNum and ensuring all pods are Ready By(fmt.Sprintf("Scaling up replicaset %s to %d", rsName, scaleNum)) - _, err = framework.UpdateReplicaSetWithRetries(c, ns, rsName, func(rs *extensions.ReplicaSet) { + _, err = framework.UpdateReplicaSetWithRetries(c, ns, rsName, func(rs *apps.ReplicaSet) { *rs.Spec.Replicas = scaleNum }) framework.ExpectNoError(err) diff --git a/test/integration/deployment/util.go b/test/integration/deployment/util.go index e33cce4f0ad..de627aa8fad 100644 --- a/test/integration/deployment/util.go +++ b/test/integration/deployment/util.go @@ -165,7 +165,7 @@ func dcSetup(t *testing.T) (*httptest.Server, framework.CloseFunc, *replicaset.R t.Fatalf("error creating Deployment controller: %v", err) } rm := replicaset.NewReplicaSetController( - informers.Extensions().V1beta1().ReplicaSets(), + informers.Apps().V1().ReplicaSets(), informers.Core().V1().Pods(), clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "replicaset-controller")), replicaset.BurstReplicas, @@ -364,12 +364,12 @@ func (d *deploymentTester) expectNewReplicaSet() (*v1beta1.ReplicaSet, error) { return rs, nil } -func (d *deploymentTester) updateReplicaSet(name string, applyUpdate testutil.UpdateReplicaSetFunc) (*v1beta1.ReplicaSet, error) { - return testutil.UpdateReplicaSetWithRetries(d.c, d.deployment.Namespace, name, applyUpdate, d.t.Logf, pollInterval, pollTimeout) +func (d *deploymentTester) updateReplicaSet(name string, applyUpdate testutil.UpdateExtensionsReplicaSetFunc) (*v1beta1.ReplicaSet, error) { + return testutil.UpdateExtensionsReplicaSetWithRetries(d.c, d.deployment.Namespace, name, applyUpdate, d.t.Logf, pollInterval, pollTimeout) } -func (d *deploymentTester) updateReplicaSetStatus(name string, applyStatusUpdate testutil.UpdateReplicaSetFunc) (*v1beta1.ReplicaSet, error) { - return testutil.UpdateReplicaSetStatusWithRetries(d.c, d.deployment.Namespace, name, applyStatusUpdate, d.t.Logf, pollInterval, pollTimeout) +func (d *deploymentTester) updateReplicaSetStatus(name string, applyStatusUpdate testutil.UpdateExtensionsReplicaSetFunc) (*v1beta1.ReplicaSet, error) { + return testutil.UpdateExtensionsReplicaSetStatusWithRetries(d.c, d.deployment.Namespace, name, applyStatusUpdate, d.t.Logf, pollInterval, pollTimeout) } // waitForDeploymentRollbackCleared waits for deployment either started rolling back or doesn't need to rollback. diff --git a/test/integration/replicaset/replicaset_test.go b/test/integration/replicaset/replicaset_test.go index b68ddebdd35..e484db250dd 100644 --- a/test/integration/replicaset/replicaset_test.go +++ b/test/integration/replicaset/replicaset_test.go @@ -151,7 +151,7 @@ func rmSetup(t *testing.T) (*httptest.Server, framework.CloseFunc, *replicaset.R informers := informers.NewSharedInformerFactory(clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "rs-informers")), resyncPeriod) rm := replicaset.NewReplicaSetController( - informers.Extensions().V1beta1().ReplicaSets(), + informers.Apps().V1().ReplicaSets(), informers.Core().V1().Pods(), clientset.NewForConfigOrDie(restclient.AddUserAgent(&config, "replicaset-controller")), replicaset.BurstReplicas, diff --git a/test/utils/replicaset.go b/test/utils/replicaset.go index 7d5176d4eab..5e98bf969ba 100644 --- a/test/utils/replicaset.go +++ b/test/utils/replicaset.go @@ -21,15 +21,43 @@ import ( "testing" "time" + apps "k8s.io/api/apps/v1" extensions "k8s.io/api/extensions/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" ) -type UpdateReplicaSetFunc func(d *extensions.ReplicaSet) +type UpdateReplicaSetFunc func(d *apps.ReplicaSet) -func UpdateReplicaSetWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*extensions.ReplicaSet, error) { +func UpdateReplicaSetWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*apps.ReplicaSet, error) { + var rs *apps.ReplicaSet + var updateErr error + pollErr := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { + var err error + if rs, err = c.AppsV1().ReplicaSets(namespace).Get(name, metav1.GetOptions{}); err != nil { + return false, err + } + // Apply the update, then attempt to push it to the apiserver. + applyUpdate(rs) + if rs, err = c.AppsV1().ReplicaSets(namespace).Update(rs); err == nil { + logf("Updating replica set %q", name) + return true, nil + } + updateErr = err + return false, nil + }) + if pollErr == wait.ErrWaitTimeout { + pollErr = fmt.Errorf("couldn't apply the provided updated to replicaset %q: %v", name, updateErr) + } + return rs, pollErr +} + +// TODO(#55714): Remove this after Deployment tests use apps/v1 ReplicaSet. +type UpdateExtensionsReplicaSetFunc func(d *extensions.ReplicaSet) + +// TODO(#55714): Remove this after Deployment tests use apps/v1 ReplicaSet. +func UpdateExtensionsReplicaSetWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateExtensionsReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*extensions.ReplicaSet, error) { var rs *extensions.ReplicaSet var updateErr error pollErr := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { @@ -67,7 +95,7 @@ func WaitRSStable(t *testing.T, clientSet clientset.Interface, rs *extensions.Re return nil } -func UpdateReplicaSetStatusWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*extensions.ReplicaSet, error) { +func UpdateExtensionsReplicaSetStatusWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateExtensionsReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*extensions.ReplicaSet, error) { var rs *extensions.ReplicaSet var updateErr error pollErr := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { From f3ba27a5003d1defff617b72aa4a055d1e2806d5 Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Mon, 19 Mar 2018 14:23:52 -0700 Subject: [PATCH 5/6] ReplicaSet: Use apps/v1 RS in integration test. --- test/integration/deployment/util.go | 2 +- .../integration/replicaset/replicaset_test.go | 147 +++++++++--------- test/utils/replicaset.go | 18 ++- 3 files changed, 94 insertions(+), 73 deletions(-) diff --git a/test/integration/deployment/util.go b/test/integration/deployment/util.go index de627aa8fad..70240ea94a8 100644 --- a/test/integration/deployment/util.go +++ b/test/integration/deployment/util.go @@ -418,7 +418,7 @@ func (d *deploymentTester) listUpdatedPods() ([]v1.Pod, error) { } func (d *deploymentTester) waitRSStable(replicaset *v1beta1.ReplicaSet) error { - return testutil.WaitRSStable(d.t, d.c, replicaset, pollInterval, pollTimeout) + return testutil.WaitExtensionsRSStable(d.t, d.c, replicaset, pollInterval, pollTimeout) } func (d *deploymentTester) scaleDeployment(newReplicas int32) error { diff --git a/test/integration/replicaset/replicaset_test.go b/test/integration/replicaset/replicaset_test.go index e484db250dd..ac4642f763b 100644 --- a/test/integration/replicaset/replicaset_test.go +++ b/test/integration/replicaset/replicaset_test.go @@ -24,8 +24,8 @@ import ( "testing" "time" + apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" - "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -33,8 +33,8 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/informers" clientset "k8s.io/client-go/kubernetes" + appsclient "k8s.io/client-go/kubernetes/typed/apps/v1" typedv1 "k8s.io/client-go/kubernetes/typed/core/v1" - typedv1beta1 "k8s.io/client-go/kubernetes/typed/extensions/v1beta1" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/retry" @@ -54,18 +54,18 @@ func labelMap() map[string]string { return map[string]string{"foo": "bar"} } -func newRS(name, namespace string, replicas int) *v1beta1.ReplicaSet { +func newRS(name, namespace string, replicas int) *apps.ReplicaSet { replicasCopy := int32(replicas) - return &v1beta1.ReplicaSet{ + return &apps.ReplicaSet{ TypeMeta: metav1.TypeMeta{ Kind: "ReplicaSet", - APIVersion: "extensions/v1beta1", + APIVersion: "apps/v1", }, ObjectMeta: metav1.ObjectMeta{ Namespace: namespace, Name: name, }, - Spec: v1beta1.ReplicaSetSpec{ + Spec: apps.ReplicaSetSpec{ Selector: &metav1.LabelSelector{ MatchLabels: labelMap(), }, @@ -196,11 +196,11 @@ func waitToObservePods(t *testing.T, podInformer cache.SharedIndexInformer, podN } } -func createRSsPods(t *testing.T, clientSet clientset.Interface, rss []*v1beta1.ReplicaSet, pods []*v1.Pod) ([]*v1beta1.ReplicaSet, []*v1.Pod) { - var createdRSs []*v1beta1.ReplicaSet +func createRSsPods(t *testing.T, clientSet clientset.Interface, rss []*apps.ReplicaSet, pods []*v1.Pod) ([]*apps.ReplicaSet, []*v1.Pod) { + var createdRSs []*apps.ReplicaSet var createdPods []*v1.Pod for _, rs := range rss { - createdRS, err := clientSet.ExtensionsV1beta1().ReplicaSets(rs.Namespace).Create(rs) + createdRS, err := clientSet.AppsV1().ReplicaSets(rs.Namespace).Create(rs) if err != nil { t.Fatalf("Failed to create replica set %s: %v", rs.Name, err) } @@ -218,16 +218,16 @@ func createRSsPods(t *testing.T, clientSet clientset.Interface, rss []*v1beta1.R } // Verify .Status.Replicas is equal to .Spec.Replicas -func waitRSStable(t *testing.T, clientSet clientset.Interface, rs *v1beta1.ReplicaSet) { +func waitRSStable(t *testing.T, clientSet clientset.Interface, rs *apps.ReplicaSet) { if err := testutil.WaitRSStable(t, clientSet, rs, interval, timeout); err != nil { t.Fatal(err) } } // Update .Spec.Replicas to replicas and verify .Status.Replicas is changed accordingly -func scaleRS(t *testing.T, c clientset.Interface, rs *v1beta1.ReplicaSet, replicas int32) { - rsClient := c.ExtensionsV1beta1().ReplicaSets(rs.Namespace) - rs = updateRS(t, rsClient, rs.Name, func(rs *v1beta1.ReplicaSet) { +func scaleRS(t *testing.T, c clientset.Interface, rs *apps.ReplicaSet, replicas int32) { + rsClient := c.AppsV1().ReplicaSets(rs.Namespace) + rs = updateRS(t, rsClient, rs.Name, func(rs *apps.ReplicaSet) { *rs.Spec.Replicas = replicas }) waitRSStable(t, c, rs) @@ -273,8 +273,8 @@ func getPods(t *testing.T, podClient typedv1.PodInterface, labelMap map[string]s return pods } -func updateRS(t *testing.T, rsClient typedv1beta1.ReplicaSetInterface, rsName string, updateFunc func(*v1beta1.ReplicaSet)) *v1beta1.ReplicaSet { - var rs *v1beta1.ReplicaSet +func updateRS(t *testing.T, rsClient appsclient.ReplicaSetInterface, rsName string, updateFunc func(*apps.ReplicaSet)) *apps.ReplicaSet { + var rs *apps.ReplicaSet if err := retry.RetryOnConflict(retry.DefaultBackoff, func() error { newRS, err := rsClient.Get(rsName, metav1.GetOptions{}) if err != nil { @@ -290,7 +290,7 @@ func updateRS(t *testing.T, rsClient typedv1beta1.ReplicaSetInterface, rsName st } // Verify ControllerRef of a RS pod that has incorrect attributes is automatically patched by the RS -func testPodControllerRefPatch(t *testing.T, c clientset.Interface, pod *v1.Pod, ownerReference *metav1.OwnerReference, rs *v1beta1.ReplicaSet, expectedOwnerReferenceNum int) { +func testPodControllerRefPatch(t *testing.T, c clientset.Interface, pod *v1.Pod, ownerReference *metav1.OwnerReference, rs *apps.ReplicaSet, expectedOwnerReferenceNum int) { ns := rs.Namespace podClient := c.CoreV1().Pods(ns) updatePod(t, podClient, pod.Name, func(pod *v1.Pod) { @@ -359,7 +359,7 @@ func setPodsReadyCondition(t *testing.T, clientSet clientset.Interface, pods *v1 } } -func testScalingUsingScaleSubresource(t *testing.T, c clientset.Interface, rs *v1beta1.ReplicaSet, replicas int32) { +func testScalingUsingScaleSubresource(t *testing.T, c clientset.Interface, rs *apps.ReplicaSet, replicas int32) { ns := rs.Namespace rsClient := c.ExtensionsV1beta1().ReplicaSets(ns) newRS, err := rsClient.Get(rs.Name, metav1.GetOptions{}) @@ -401,48 +401,48 @@ func TestAdoption(t *testing.T) { boolPtr := func(b bool) *bool { return &b } testCases := []struct { name string - existingOwnerReferences func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference - expectedOwnerReferences func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference + existingOwnerReferences func(rs *apps.ReplicaSet) []metav1.OwnerReference + expectedOwnerReferences func(rs *apps.ReplicaSet) []metav1.OwnerReference }{ { "pod refers rs as an owner, not a controller", - func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet"}} + func(rs *apps.ReplicaSet) []metav1.OwnerReference { + return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "apps/v1", Kind: "ReplicaSet"}} }, - func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true), BlockOwnerDeletion: boolPtr(true)}} + func(rs *apps.ReplicaSet) []metav1.OwnerReference { + return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "apps/v1", Kind: "ReplicaSet", Controller: boolPtr(true), BlockOwnerDeletion: boolPtr(true)}} }, }, { "pod doesn't have owner references", - func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { + func(rs *apps.ReplicaSet) []metav1.OwnerReference { return []metav1.OwnerReference{} }, - func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true), BlockOwnerDeletion: boolPtr(true)}} + func(rs *apps.ReplicaSet) []metav1.OwnerReference { + return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "apps/v1", Kind: "ReplicaSet", Controller: boolPtr(true), BlockOwnerDeletion: boolPtr(true)}} }, }, { "pod refers rs as a controller", - func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true)}} + func(rs *apps.ReplicaSet) []metav1.OwnerReference { + return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "apps/v1", Kind: "ReplicaSet", Controller: boolPtr(true)}} }, - func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true)}} + func(rs *apps.ReplicaSet) []metav1.OwnerReference { + return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "apps/v1", Kind: "ReplicaSet", Controller: boolPtr(true)}} }, }, { "pod refers other rs as the controller, refers the rs as an owner", - func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { + func(rs *apps.ReplicaSet) []metav1.OwnerReference { return []metav1.OwnerReference{ - {UID: "1", Name: "anotherRS", APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true)}, - {UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet"}, + {UID: "1", Name: "anotherRS", APIVersion: "apps/v1", Kind: "ReplicaSet", Controller: boolPtr(true)}, + {UID: rs.UID, Name: rs.Name, APIVersion: "apps/v1", Kind: "ReplicaSet"}, } }, - func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { + func(rs *apps.ReplicaSet) []metav1.OwnerReference { return []metav1.OwnerReference{ - {UID: "1", Name: "anotherRS", APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true)}, - {UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet"}, + {UID: "1", Name: "anotherRS", APIVersion: "apps/v1", Kind: "ReplicaSet", Controller: boolPtr(true)}, + {UID: rs.UID, Name: rs.Name, APIVersion: "apps/v1", Kind: "ReplicaSet"}, } }, }, @@ -454,7 +454,7 @@ func TestAdoption(t *testing.T) { ns := framework.CreateTestingNamespace(fmt.Sprintf("rs-adoption-%d", i), s, t) defer framework.DeleteTestingNamespace(ns, s, t) - rsClient := clientSet.ExtensionsV1beta1().ReplicaSets(ns.Name) + rsClient := clientSet.AppsV1().ReplicaSets(ns.Name) podClient := clientSet.CoreV1().Pods(ns.Name) const rsName = "rs" rs, err := rsClient.Create(newRS(rsName, ns.Name, 1)) @@ -496,13 +496,17 @@ func TestRSSelectorImmutability(t *testing.T) { ns := framework.CreateTestingNamespace("rs-selector-immutability", s, t) defer framework.DeleteTestingNamespace(ns, s, t) rs := newRS("rs", ns.Name, 0) - createRSsPods(t, clientSet, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + createRSsPods(t, clientSet, []*apps.ReplicaSet{rs}, []*v1.Pod{}) // test to ensure extensions/v1beta1 selector is mutable newSelectorLabels := map[string]string{"changed_name_extensions_v1beta1": "changed_test_extensions_v1beta1"} - rs.Spec.Selector.MatchLabels = newSelectorLabels - rs.Spec.Template.Labels = newSelectorLabels - replicaset, err := clientSet.ExtensionsV1beta1().ReplicaSets(ns.Name).Update(rs) + rsExt, err := clientSet.ExtensionsV1beta1().ReplicaSets(ns.Name).Get(rs.Name, metav1.GetOptions{}) + if err != nil { + t.Fatalf("failed to get extensions/v1beta replicaset %s: %v", rs.Name, err) + } + rsExt.Spec.Selector.MatchLabels = newSelectorLabels + rsExt.Spec.Template.Labels = newSelectorLabels + replicaset, err := clientSet.ExtensionsV1beta1().ReplicaSets(ns.Name).Update(rsExt) if err != nil { t.Fatalf("failed to update extensions/v1beta1 replicaset %s: %v", replicaset.Name, err) } @@ -510,17 +514,17 @@ func TestRSSelectorImmutability(t *testing.T) { t.Errorf("selector should be changed for extensions/v1beta1, expected: %v, got: %v", newSelectorLabels, replicaset.Spec.Selector.MatchLabels) } - // test to ensure apps/v1beta2 selector is immutable - rsV1beta2, err := clientSet.AppsV1beta2().ReplicaSets(ns.Name).Get(replicaset.Name, metav1.GetOptions{}) + // test to ensure apps/v1 selector is immutable + rsV1, err := clientSet.AppsV1().ReplicaSets(ns.Name).Get(rs.Name, metav1.GetOptions{}) if err != nil { - t.Fatalf("failed to get apps/v1beta2 replicaset %s: %v", replicaset.Name, err) + t.Fatalf("failed to get apps/v1 replicaset %s: %v", rs.Name, err) } - newSelectorLabels = map[string]string{"changed_name_apps_v1beta2": "changed_test_apps_v1beta2"} - rsV1beta2.Spec.Selector.MatchLabels = newSelectorLabels - rsV1beta2.Spec.Template.Labels = newSelectorLabels - _, err = clientSet.AppsV1beta2().ReplicaSets(ns.Name).Update(rsV1beta2) + newSelectorLabels = map[string]string{"changed_name_apps_v1": "changed_test_apps_v1"} + rsV1.Spec.Selector.MatchLabels = newSelectorLabels + rsV1.Spec.Template.Labels = newSelectorLabels + _, err = clientSet.AppsV1().ReplicaSets(ns.Name).Update(rsV1) if err == nil { - t.Fatalf("failed to provide validation error when changing immutable selector when updating apps/v1beta2 replicaset %s", rsV1beta2.Name) + t.Fatalf("failed to provide validation error when changing immutable selector when updating apps/v1 replicaset %s", rsV1.Name) } expectedErrType := "Invalid value" expectedErrDetail := "field is immutable" @@ -538,7 +542,7 @@ func TestSpecReplicasChange(t *testing.T) { defer close(stopCh) rs := newRS("rs", ns.Name, 2) - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, []*v1.Pod{}) rs = rss[0] waitRSStable(t, c, rs) @@ -549,9 +553,9 @@ func TestSpecReplicasChange(t *testing.T) { // Add a template annotation change to test RS's status does update // without .Spec.Replicas change - rsClient := c.ExtensionsV1beta1().ReplicaSets(ns.Name) + rsClient := c.AppsV1().ReplicaSets(ns.Name) var oldGeneration int64 - newRS := updateRS(t, rsClient, rs.Name, func(rs *v1beta1.ReplicaSet) { + newRS := updateRS(t, rsClient, rs.Name, func(rs *apps.ReplicaSet) { oldGeneration = rs.Generation rs.Spec.Template.Annotations = map[string]string{"test": "annotation"} }) @@ -580,7 +584,7 @@ func TestDeletingAndFailedPods(t *testing.T) { defer close(stopCh) rs := newRS("rs", ns.Name, 2) - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, []*v1.Pod{}) rs = rss[0] waitRSStable(t, c, rs) @@ -648,7 +652,7 @@ func TestOverlappingRSs(t *testing.T) { for i := 0; i < 2; i++ { // One RS has 1 replica, and another has 2 replicas rs := newRS(fmt.Sprintf("rs-%d", i+1), ns.Name, i+1) - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, []*v1.Pod{}) waitRSStable(t, c, rss[0]) } @@ -680,7 +684,7 @@ func TestPodOrphaningAndAdoptionWhenLabelsChange(t *testing.T) { defer close(stopCh) rs := newRS("rs", ns.Name, 1) - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, []*v1.Pod{}) rs = rss[0] waitRSStable(t, c, rs) @@ -757,7 +761,7 @@ func TestGeneralPodAdoption(t *testing.T) { defer close(stopCh) rs := newRS("rs", ns.Name, 1) - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, []*v1.Pod{}) rs = rss[0] waitRSStable(t, c, rs) @@ -772,11 +776,11 @@ func TestGeneralPodAdoption(t *testing.T) { // When the only OwnerReference of the pod points to another type of API object such as statefulset // with Controller=false, the RS should add a second OwnerReference (ControllerRef) pointing to itself // with Controller=true - ownerReference := metav1.OwnerReference{UID: uuid.NewUUID(), APIVersion: "apps/v1beta1", Kind: "StatefulSet", Name: rs.Name, Controller: &falseVar} + ownerReference := metav1.OwnerReference{UID: uuid.NewUUID(), APIVersion: "apps/v1", Kind: "StatefulSet", Name: rs.Name, Controller: &falseVar} testPodControllerRefPatch(t, c, pod, &ownerReference, rs, 2) // When the only OwnerReference of the pod points to the RS, but Controller=false - ownerReference = metav1.OwnerReference{UID: rs.UID, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Name: rs.Name, Controller: &falseVar} + ownerReference = metav1.OwnerReference{UID: rs.UID, APIVersion: "apps/v1", Kind: "ReplicaSet", Name: rs.Name, Controller: &falseVar} testPodControllerRefPatch(t, c, pod, &ownerReference, rs, 1) } @@ -790,7 +794,7 @@ func TestReadyAndAvailableReplicas(t *testing.T) { rs := newRS("rs", ns.Name, 3) rs.Spec.MinReadySeconds = 3600 - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, []*v1.Pod{}) rs = rss[0] waitRSStable(t, c, rs) @@ -841,7 +845,7 @@ func TestRSScaleSubresource(t *testing.T) { defer close(stopCh) rs := newRS("rs", ns.Name, 1) - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, []*v1.Pod{}) rs = rss[0] waitRSStable(t, c, rs) @@ -865,7 +869,7 @@ func TestExtraPodsAdoptionAndDeletion(t *testing.T) { pod.Labels = labelMap() podList = append(podList, pod) } - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, podList) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, podList) rs = rss[0] stopCh := runControllerAndInformers(t, rm, informers, 3) defer close(stopCh) @@ -893,13 +897,13 @@ func TestFullyLabeledReplicas(t *testing.T) { extraLabelMap := map[string]string{"foo": "bar", "extraKey": "extraValue"} rs := newRS("rs", ns.Name, 2) - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, []*v1.Pod{}) rs = rss[0] waitRSStable(t, c, rs) // Change RS's template labels to have extra labels, but not its selector - rsClient := c.ExtensionsV1beta1().ReplicaSets(ns.Name) - updateRS(t, rsClient, rs.Name, func(rs *v1beta1.ReplicaSet) { + rsClient := c.AppsV1().ReplicaSets(ns.Name) + updateRS(t, rsClient, rs.Name, func(rs *apps.ReplicaSet) { rs.Spec.Template.Labels = extraLabelMap }) @@ -937,7 +941,7 @@ func TestReplicaSetsExtensionsV1beta1DefaultGCPolicy(t *testing.T) { rs := newRS("rs", ns.Name, 2) fakeFinalizer := "kube.io/dummy-finalizer" rs.Finalizers = []string{fakeFinalizer} - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, []*v1.Pod{}) rs = rss[0] waitRSStable(t, c, rs) @@ -948,13 +952,14 @@ func TestReplicaSetsExtensionsV1beta1DefaultGCPolicy(t *testing.T) { t.Fatalf("len(pods) = %d, want 2", len(pods.Items)) } - rsClient := c.ExtensionsV1beta1().ReplicaSets(ns.Name) - err := rsClient.Delete(rs.Name, nil) + // Delete via the extensions/v1beta1 endpoint. + err := c.ExtensionsV1beta1().ReplicaSets(ns.Name).Delete(rs.Name, nil) if err != nil { t.Fatalf("Failed to delete rs: %v", err) } // Verify orphan finalizer has been added + rsClient := c.AppsV1().ReplicaSets(ns.Name) if err := wait.PollImmediate(interval, timeout, func() (bool, error) { newRS, err := rsClient.Get(rs.Name, metav1.GetOptions{}) if err != nil { @@ -965,7 +970,7 @@ func TestReplicaSetsExtensionsV1beta1DefaultGCPolicy(t *testing.T) { t.Fatalf("Failed to verify orphan finalizer is added: %v", err) } - updateRS(t, rsClient, rs.Name, func(rs *v1beta1.ReplicaSet) { + updateRS(t, rsClient, rs.Name, func(rs *apps.ReplicaSet) { var finalizers []string // remove fakeFinalizer for _, finalizer := range rs.Finalizers { @@ -982,7 +987,7 @@ func TestReplicaSetsExtensionsV1beta1DefaultGCPolicy(t *testing.T) { func TestReplicaSetsAppsV1DefaultGCPolicy(t *testing.T) { s, closeFn, rm, informers, c := rmSetup(t) defer closeFn() - ns := framework.CreateTestingNamespace("test-default-gc-extensions", s, t) + ns := framework.CreateTestingNamespace("test-default-gc-v1", s, t) defer framework.DeleteTestingNamespace(ns, s, t) stopCh := runControllerAndInformers(t, rm, informers, 0) defer close(stopCh) @@ -990,7 +995,7 @@ func TestReplicaSetsAppsV1DefaultGCPolicy(t *testing.T) { rs := newRS("rs", ns.Name, 2) fakeFinalizer := "kube.io/dummy-finalizer" rs.Finalizers = []string{fakeFinalizer} - rss, _ := createRSsPods(t, c, []*v1beta1.ReplicaSet{rs}, []*v1.Pod{}) + rss, _ := createRSsPods(t, c, []*apps.ReplicaSet{rs}, []*v1.Pod{}) rs = rss[0] waitRSStable(t, c, rs) @@ -1024,7 +1029,7 @@ func TestReplicaSetsAppsV1DefaultGCPolicy(t *testing.T) { t.Fatalf("Failed to verify the finalizer: %v", err) } - updateRS(t, c.ExtensionsV1beta1().ReplicaSets(ns.Name), rs.Name, func(rs *v1beta1.ReplicaSet) { + updateRS(t, c.AppsV1().ReplicaSets(ns.Name), rs.Name, func(rs *apps.ReplicaSet) { var finalizers []string // remove fakeFinalizer for _, finalizer := range rs.Finalizers { diff --git a/test/utils/replicaset.go b/test/utils/replicaset.go index 5e98bf969ba..bcd52a89264 100644 --- a/test/utils/replicaset.go +++ b/test/utils/replicaset.go @@ -81,7 +81,22 @@ func UpdateExtensionsReplicaSetWithRetries(c clientset.Interface, namespace, nam } // Verify .Status.Replicas is equal to .Spec.Replicas -func WaitRSStable(t *testing.T, clientSet clientset.Interface, rs *extensions.ReplicaSet, pollInterval, pollTimeout time.Duration) error { +func WaitRSStable(t *testing.T, clientSet clientset.Interface, rs *apps.ReplicaSet, pollInterval, pollTimeout time.Duration) error { + desiredGeneration := rs.Generation + if err := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { + newRS, err := clientSet.AppsV1().ReplicaSets(rs.Namespace).Get(rs.Name, metav1.GetOptions{}) + if err != nil { + return false, err + } + return newRS.Status.ObservedGeneration >= desiredGeneration && newRS.Status.Replicas == *rs.Spec.Replicas, nil + }); err != nil { + return fmt.Errorf("failed to verify .Status.Replicas is equal to .Spec.Replicas for replicaset %q: %v", rs.Name, err) + } + return nil +} + +// TODO(#55714): Remove after Deployment tests use apps/v1 ReplicaSet. +func WaitExtensionsRSStable(t *testing.T, clientSet clientset.Interface, rs *extensions.ReplicaSet, pollInterval, pollTimeout time.Duration) error { desiredGeneration := rs.Generation if err := wait.PollImmediate(pollInterval, pollTimeout, func() (bool, error) { newRS, err := clientSet.ExtensionsV1beta1().ReplicaSets(rs.Namespace).Get(rs.Name, metav1.GetOptions{}) @@ -95,6 +110,7 @@ func WaitRSStable(t *testing.T, clientSet clientset.Interface, rs *extensions.Re return nil } +// TODO(#55714): Remove after Deployment tests use apps/v1 ReplicaSet. func UpdateExtensionsReplicaSetStatusWithRetries(c clientset.Interface, namespace, name string, applyUpdate UpdateExtensionsReplicaSetFunc, logf LogfFn, pollInterval, pollTimeout time.Duration) (*extensions.ReplicaSet, error) { var rs *extensions.ReplicaSet var updateErr error From c4c6e4bbb8d3f17e2287e4a272aec53dee96b342 Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Mon, 19 Mar 2018 14:36:22 -0700 Subject: [PATCH 6/6] hack/update-bazel.sh --- pkg/controller/replicaset/BUILD | 10 +++++----- pkg/controller/replication/BUILD | 8 +++----- test/integration/replicaset/BUILD | 4 ++-- test/utils/BUILD | 1 + 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/pkg/controller/replicaset/BUILD b/pkg/controller/replicaset/BUILD index 20a82ccf33d..6392ee38710 100644 --- a/pkg/controller/replicaset/BUILD +++ b/pkg/controller/replicaset/BUILD @@ -19,22 +19,22 @@ go_library( "//pkg/controller:go_default_library", "//pkg/util/metrics:go_default_library", "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/apps/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/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//vendor/k8s.io/client-go/informers/apps/v1:go_default_library", "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/extensions/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", + "//vendor/k8s.io/client-go/listers/apps/v1:go_default_library", "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/listers/extensions/v1beta1:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/client-go/util/integer:go_default_library", @@ -53,8 +53,8 @@ go_test( "//pkg/api/legacyscheme:go_default_library", "//pkg/controller:go_default_library", "//pkg/securitycontext:go_default_library", + "//vendor/k8s.io/api/apps/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/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/controller/replication/BUILD b/pkg/controller/replication/BUILD index c3f4b39782e..a382e2b9663 100644 --- a/pkg/controller/replication/BUILD +++ b/pkg/controller/replication/BUILD @@ -16,14 +16,14 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/controller/replication", deps = [ + "//pkg/apis/apps/v1:go_default_library", "//pkg/apis/core/v1:go_default_library", "//pkg/apis/extensions:go_default_library", - "//pkg/apis/extensions/v1beta1:go_default_library", "//pkg/controller:go_default_library", "//pkg/controller/replicaset:go_default_library", "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/apps/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/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -34,11 +34,9 @@ go_library( "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", + "//vendor/k8s.io/client-go/listers/apps/v1:go_default_library", "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/listers/extensions/v1beta1:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/client-go/tools/record:go_default_library", ], diff --git a/test/integration/replicaset/BUILD b/test/integration/replicaset/BUILD index c8f90765dbd..f2d5c6cf9da 100644 --- a/test/integration/replicaset/BUILD +++ b/test/integration/replicaset/BUILD @@ -19,8 +19,8 @@ go_test( "//pkg/util/slice:go_default_library", "//test/integration/framework:go_default_library", "//test/utils:go_default_library", + "//vendor/k8s.io/api/apps/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/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", @@ -28,8 +28,8 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/client-go/util/retry:go_default_library", diff --git a/test/utils/BUILD b/test/utils/BUILD index 2c04822316f..0119d85a21c 100644 --- a/test/utils/BUILD +++ b/test/utils/BUILD @@ -32,6 +32,7 @@ go_library( "//pkg/util/labels:go_default_library", "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/apps/v1:go_default_library", "//vendor/k8s.io/api/batch/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/extensions/v1beta1:go_default_library",