mirror of
https://github.com/k3s-io/kubernetes.git
synced 2026-01-05 23:47:50 +00:00
refactor replicaset sync call tree
This commit is contained in:
246
pkg/controller/replicaset/replica_set_utils_test.go
Normal file
246
pkg/controller/replicaset/replica_set_utils_test.go
Normal file
@@ -0,0 +1,246 @@
|
||||
/*
|
||||
Copyright 2017 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// If you make changes to this file, you should also make the corresponding change in ReplicationController.
|
||||
|
||||
package replicaset
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
extensions "k8s.io/api/extensions/v1beta1"
|
||||
)
|
||||
|
||||
func TestCalculateStatus(t *testing.T) {
|
||||
labelMap := map[string]string{"name": "foo"}
|
||||
fullLabelMap := map[string]string{"name": "foo", "type": "production"}
|
||||
notFullyLabelledRS := newReplicaSet(1, labelMap)
|
||||
// Set replica num to 2 for status condition testing (diff < 0, diff > 0)
|
||||
fullyLabelledRS := newReplicaSet(2, fullLabelMap)
|
||||
longMinReadySecondsRS := newReplicaSet(1, fullLabelMap)
|
||||
longMinReadySecondsRS.Spec.MinReadySeconds = 3600
|
||||
|
||||
rsStatusTests := []struct {
|
||||
name string
|
||||
replicaset *extensions.ReplicaSet
|
||||
filteredPods []*v1.Pod
|
||||
expectedReplicaSetStatus extensions.ReplicaSetStatus
|
||||
}{
|
||||
{
|
||||
"1 fully labelled pod",
|
||||
fullyLabelledRS,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", fullyLabelledRS, v1.PodRunning, nil, true),
|
||||
},
|
||||
extensions.ReplicaSetStatus{
|
||||
Replicas: 1,
|
||||
FullyLabeledReplicas: 1,
|
||||
ReadyReplicas: 1,
|
||||
AvailableReplicas: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
"1 not fully labelled pod",
|
||||
notFullyLabelledRS,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", notFullyLabelledRS, v1.PodRunning, nil, true),
|
||||
},
|
||||
extensions.ReplicaSetStatus{
|
||||
Replicas: 1,
|
||||
FullyLabeledReplicas: 0,
|
||||
ReadyReplicas: 1,
|
||||
AvailableReplicas: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
"2 fully labelled pods",
|
||||
fullyLabelledRS,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", fullyLabelledRS, v1.PodRunning, nil, true),
|
||||
newPod("pod2", fullyLabelledRS, v1.PodRunning, nil, true),
|
||||
},
|
||||
extensions.ReplicaSetStatus{
|
||||
Replicas: 2,
|
||||
FullyLabeledReplicas: 2,
|
||||
ReadyReplicas: 2,
|
||||
AvailableReplicas: 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
"2 not fully labelled pods",
|
||||
notFullyLabelledRS,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", notFullyLabelledRS, v1.PodRunning, nil, true),
|
||||
newPod("pod2", notFullyLabelledRS, v1.PodRunning, nil, true),
|
||||
},
|
||||
extensions.ReplicaSetStatus{
|
||||
Replicas: 2,
|
||||
FullyLabeledReplicas: 0,
|
||||
ReadyReplicas: 2,
|
||||
AvailableReplicas: 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
"1 fully labelled pod, 1 not fully labelled pod",
|
||||
notFullyLabelledRS,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", notFullyLabelledRS, v1.PodRunning, nil, true),
|
||||
newPod("pod2", fullyLabelledRS, v1.PodRunning, nil, true),
|
||||
},
|
||||
extensions.ReplicaSetStatus{
|
||||
Replicas: 2,
|
||||
FullyLabeledReplicas: 1,
|
||||
ReadyReplicas: 2,
|
||||
AvailableReplicas: 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
"1 non-ready pod",
|
||||
fullyLabelledRS,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", fullyLabelledRS, v1.PodPending, nil, true),
|
||||
},
|
||||
extensions.ReplicaSetStatus{
|
||||
Replicas: 1,
|
||||
FullyLabeledReplicas: 1,
|
||||
ReadyReplicas: 0,
|
||||
AvailableReplicas: 0,
|
||||
},
|
||||
},
|
||||
{
|
||||
"1 ready but non-available pod",
|
||||
longMinReadySecondsRS,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", longMinReadySecondsRS, v1.PodRunning, nil, true),
|
||||
},
|
||||
extensions.ReplicaSetStatus{
|
||||
Replicas: 1,
|
||||
FullyLabeledReplicas: 1,
|
||||
ReadyReplicas: 1,
|
||||
AvailableReplicas: 0,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range rsStatusTests {
|
||||
replicaSetStatus := calculateStatus(test.replicaset, test.filteredPods, nil)
|
||||
if !reflect.DeepEqual(replicaSetStatus, test.expectedReplicaSetStatus) {
|
||||
t.Errorf("%s: unexpected replicaset status: expected %v, got %v", test.name, test.expectedReplicaSetStatus, replicaSetStatus)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCalculateStatusConditions(t *testing.T) {
|
||||
labelMap := map[string]string{"name": "foo"}
|
||||
rs := newReplicaSet(2, labelMap)
|
||||
replicaFailureRS := newReplicaSet(10, labelMap)
|
||||
replicaFailureRS.Status.Conditions = []extensions.ReplicaSetCondition{
|
||||
{
|
||||
Type: extensions.ReplicaSetReplicaFailure,
|
||||
Status: v1.ConditionTrue,
|
||||
},
|
||||
}
|
||||
|
||||
rsStatusConditionTests := []struct {
|
||||
name string
|
||||
replicaset *extensions.ReplicaSet
|
||||
filteredPods []*v1.Pod
|
||||
manageReplicasErr error
|
||||
expectedReplicaSetConditions []extensions.ReplicaSetCondition
|
||||
}{
|
||||
|
||||
{
|
||||
"manageReplicasErr != nil && failureCond == nil, diff < 0",
|
||||
rs,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", rs, v1.PodRunning, nil, true),
|
||||
},
|
||||
fmt.Errorf("fake manageReplicasErr"),
|
||||
[]extensions.ReplicaSetCondition{
|
||||
{
|
||||
Type: extensions.ReplicaSetReplicaFailure,
|
||||
Status: v1.ConditionTrue,
|
||||
Reason: "FailedCreate",
|
||||
Message: "fake manageReplicasErr",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"manageReplicasErr != nil && failureCond == nil, diff > 0",
|
||||
rs,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", rs, v1.PodRunning, nil, true),
|
||||
newPod("pod2", rs, v1.PodRunning, nil, true),
|
||||
newPod("pod3", rs, v1.PodRunning, nil, true),
|
||||
},
|
||||
fmt.Errorf("fake manageReplicasErr"),
|
||||
[]extensions.ReplicaSetCondition{
|
||||
{
|
||||
Type: extensions.ReplicaSetReplicaFailure,
|
||||
Status: v1.ConditionTrue,
|
||||
Reason: "FailedDelete",
|
||||
Message: "fake manageReplicasErr",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"manageReplicasErr == nil && failureCond != nil",
|
||||
replicaFailureRS,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", replicaFailureRS, v1.PodRunning, nil, true),
|
||||
},
|
||||
nil,
|
||||
nil,
|
||||
},
|
||||
{
|
||||
"manageReplicasErr != nil && failureCond != nil",
|
||||
replicaFailureRS,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", replicaFailureRS, v1.PodRunning, nil, true),
|
||||
},
|
||||
fmt.Errorf("fake manageReplicasErr"),
|
||||
[]extensions.ReplicaSetCondition{
|
||||
{
|
||||
Type: extensions.ReplicaSetReplicaFailure,
|
||||
Status: v1.ConditionTrue,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"manageReplicasErr == nil && failureCond == nil",
|
||||
rs,
|
||||
[]*v1.Pod{
|
||||
newPod("pod1", rs, v1.PodRunning, nil, true),
|
||||
},
|
||||
nil,
|
||||
nil,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range rsStatusConditionTests {
|
||||
replicaSetStatus := calculateStatus(test.replicaset, test.filteredPods, test.manageReplicasErr)
|
||||
// all test cases have at most 1 status condition
|
||||
if len(replicaSetStatus.Conditions) > 0 {
|
||||
test.expectedReplicaSetConditions[0].LastTransitionTime = replicaSetStatus.Conditions[0].LastTransitionTime
|
||||
}
|
||||
if !reflect.DeepEqual(replicaSetStatus.Conditions, test.expectedReplicaSetConditions) {
|
||||
t.Errorf("%s: unexpected replicaset status: expected %v, got %v", test.name, test.expectedReplicaSetConditions, replicaSetStatus.Conditions)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user