Merge pull request #101909 from nolancon/cpu-mgr-testing

Additional cases for reconcileState testing
This commit is contained in:
Kubernetes Prow Robot 2021-10-30 00:01:17 -07:00 committed by GitHub
commit 08bf54678e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -705,19 +705,46 @@ func TestCPUManagerRemove(t *testing.T) {
} }
func TestReconcileState(t *testing.T) { func TestReconcileState(t *testing.T) {
testPolicy, _ := NewStaticPolicy(
&topology.CPUTopology{
NumCPUs: 8,
NumSockets: 2,
NumCores: 4,
CPUDetails: map[int]topology.CPUInfo{
0: {CoreID: 0, SocketID: 0},
1: {CoreID: 1, SocketID: 0},
2: {CoreID: 2, SocketID: 0},
3: {CoreID: 3, SocketID: 0},
4: {CoreID: 0, SocketID: 1},
5: {CoreID: 1, SocketID: 1},
6: {CoreID: 2, SocketID: 1},
7: {CoreID: 3, SocketID: 1},
},
},
0,
cpuset.NewCPUSet(),
topologymanager.NewFakeManager(),
nil)
testCases := []struct { testCases := []struct {
description string description string
policy Policy
activePods []*v1.Pod activePods []*v1.Pod
pspPS v1.PodStatus pspPS v1.PodStatus
pspFound bool pspFound bool
updateErr error
stAssignments state.ContainerCPUAssignments stAssignments state.ContainerCPUAssignments
stDefaultCPUSet cpuset.CPUSet stDefaultCPUSet cpuset.CPUSet
updateErr error lastUpdateStAssignments state.ContainerCPUAssignments
lastUpdateStDefaultCPUSet cpuset.CPUSet
expectStAssignments state.ContainerCPUAssignments
expectStDefaultCPUSet cpuset.CPUSet
expectSucceededContainerName string expectSucceededContainerName string
expectFailedContainerName string expectFailedContainerName string
}{ }{
{ {
description: "cpu manager reconclie - no error", description: "cpu manager reconcile - no error",
policy: testPolicy,
activePods: []*v1.Pod{ activePods: []*v1.Pod{
{ {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -745,18 +772,27 @@ func TestReconcileState(t *testing.T) {
}, },
}, },
pspFound: true, pspFound: true,
updateErr: nil,
stAssignments: state.ContainerCPUAssignments{ stAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{ "fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2), "fakeContainerName": cpuset.NewCPUSet(1, 2),
}, },
}, },
stDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7), stDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7),
updateErr: nil, lastUpdateStAssignments: state.ContainerCPUAssignments{},
lastUpdateStDefaultCPUSet: cpuset.NewCPUSet(),
expectStAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2),
},
},
expectStDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7),
expectSucceededContainerName: "fakeContainerName", expectSucceededContainerName: "fakeContainerName",
expectFailedContainerName: "", expectFailedContainerName: "",
}, },
{ {
description: "cpu manager reconcile init container - no error", description: "cpu manager reconcile init container - no error",
policy: testPolicy,
activePods: []*v1.Pod{ activePods: []*v1.Pod{
{ {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -784,18 +820,27 @@ func TestReconcileState(t *testing.T) {
}, },
}, },
pspFound: true, pspFound: true,
updateErr: nil,
stAssignments: state.ContainerCPUAssignments{ stAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{ "fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2), "fakeContainerName": cpuset.NewCPUSet(1, 2),
}, },
}, },
stDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7), stDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7),
updateErr: nil, lastUpdateStAssignments: state.ContainerCPUAssignments{},
lastUpdateStDefaultCPUSet: cpuset.NewCPUSet(),
expectStAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2),
},
},
expectStDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7),
expectSucceededContainerName: "fakeContainerName", expectSucceededContainerName: "fakeContainerName",
expectFailedContainerName: "", expectFailedContainerName: "",
}, },
{ {
description: "cpu manager reconcile - pod status not found", description: "cpu manager reconcile - pod status not found",
policy: testPolicy,
activePods: []*v1.Pod{ activePods: []*v1.Pod{
{ {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -813,14 +858,19 @@ func TestReconcileState(t *testing.T) {
}, },
pspPS: v1.PodStatus{}, pspPS: v1.PodStatus{},
pspFound: false, pspFound: false,
updateErr: nil,
stAssignments: state.ContainerCPUAssignments{}, stAssignments: state.ContainerCPUAssignments{},
stDefaultCPUSet: cpuset.NewCPUSet(), stDefaultCPUSet: cpuset.NewCPUSet(),
updateErr: nil, lastUpdateStAssignments: state.ContainerCPUAssignments{},
lastUpdateStDefaultCPUSet: cpuset.NewCPUSet(),
expectStAssignments: state.ContainerCPUAssignments{},
expectStDefaultCPUSet: cpuset.NewCPUSet(),
expectSucceededContainerName: "", expectSucceededContainerName: "",
expectFailedContainerName: "", expectFailedContainerName: "",
}, },
{ {
description: "cpu manager reconcile - container state not found", description: "cpu manager reconcile - container state not found",
policy: testPolicy,
activePods: []*v1.Pod{ activePods: []*v1.Pod{
{ {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -845,14 +895,19 @@ func TestReconcileState(t *testing.T) {
}, },
}, },
pspFound: true, pspFound: true,
updateErr: nil,
stAssignments: state.ContainerCPUAssignments{}, stAssignments: state.ContainerCPUAssignments{},
stDefaultCPUSet: cpuset.NewCPUSet(), stDefaultCPUSet: cpuset.NewCPUSet(),
updateErr: nil, lastUpdateStAssignments: state.ContainerCPUAssignments{},
lastUpdateStDefaultCPUSet: cpuset.NewCPUSet(),
expectStAssignments: state.ContainerCPUAssignments{},
expectStDefaultCPUSet: cpuset.NewCPUSet(),
expectSucceededContainerName: "", expectSucceededContainerName: "",
expectFailedContainerName: "fakeContainerName", expectFailedContainerName: "fakeContainerName",
}, },
{ {
description: "cpu manager reconclie - cpuset is empty", description: "cpu manager reconclie - cpuset is empty",
policy: testPolicy,
activePods: []*v1.Pod{ activePods: []*v1.Pod{
{ {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -880,18 +935,27 @@ func TestReconcileState(t *testing.T) {
}, },
}, },
pspFound: true, pspFound: true,
updateErr: nil,
stAssignments: state.ContainerCPUAssignments{ stAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{ "fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(), "fakeContainerName": cpuset.NewCPUSet(),
}, },
}, },
stDefaultCPUSet: cpuset.NewCPUSet(1, 2, 3, 4, 5, 6, 7), stDefaultCPUSet: cpuset.NewCPUSet(1, 2, 3, 4, 5, 6, 7),
updateErr: nil, lastUpdateStAssignments: state.ContainerCPUAssignments{},
lastUpdateStDefaultCPUSet: cpuset.NewCPUSet(),
expectStAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(),
},
},
expectStDefaultCPUSet: cpuset.NewCPUSet(1, 2, 3, 4, 5, 6, 7),
expectSucceededContainerName: "", expectSucceededContainerName: "",
expectFailedContainerName: "fakeContainerName", expectFailedContainerName: "fakeContainerName",
}, },
{ {
description: "cpu manager reconclie - container update error", description: "cpu manager reconclie - container update error",
policy: testPolicy,
activePods: []*v1.Pod{ activePods: []*v1.Pod{
{ {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
@ -919,23 +983,184 @@ func TestReconcileState(t *testing.T) {
}, },
}, },
pspFound: true, pspFound: true,
updateErr: fmt.Errorf("fake container update error"),
stAssignments: state.ContainerCPUAssignments{ stAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{ "fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2), "fakeContainerName": cpuset.NewCPUSet(1, 2),
}, },
}, },
stDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7), stDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7),
updateErr: fmt.Errorf("fake container update error"), lastUpdateStAssignments: state.ContainerCPUAssignments{},
lastUpdateStDefaultCPUSet: cpuset.NewCPUSet(),
expectStAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2),
},
},
expectStDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7),
expectSucceededContainerName: "", expectSucceededContainerName: "",
expectFailedContainerName: "fakeContainerName", expectFailedContainerName: "fakeContainerName",
}, },
{
description: "cpu manager reconcile - state has inactive container",
policy: testPolicy,
activePods: []*v1.Pod{
{
ObjectMeta: metav1.ObjectMeta{
Name: "fakePodName",
UID: "fakePodUID",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "fakeContainerName",
},
},
},
},
},
pspPS: v1.PodStatus{
ContainerStatuses: []v1.ContainerStatus{
{
Name: "fakeContainerName",
ContainerID: "docker://fakeContainerID",
State: v1.ContainerState{
Running: &v1.ContainerStateRunning{},
},
},
},
},
pspFound: true,
updateErr: nil,
stAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2),
},
"secondfakePodUID": map[string]cpuset.CPUSet{
"secondfakeContainerName": cpuset.NewCPUSet(3, 4),
},
},
stDefaultCPUSet: cpuset.NewCPUSet(5, 6, 7),
lastUpdateStAssignments: state.ContainerCPUAssignments{},
lastUpdateStDefaultCPUSet: cpuset.NewCPUSet(),
expectStAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2),
},
},
expectStDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7),
expectSucceededContainerName: "fakeContainerName",
expectFailedContainerName: "",
},
{
description: "cpu manager reconcile - last update state is current",
policy: testPolicy,
activePods: []*v1.Pod{
{
ObjectMeta: metav1.ObjectMeta{
Name: "fakePodName",
UID: "fakePodUID",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "fakeContainerName",
},
},
},
},
},
pspPS: v1.PodStatus{
ContainerStatuses: []v1.ContainerStatus{
{
Name: "fakeContainerName",
ContainerID: "docker://fakeContainerID",
State: v1.ContainerState{
Running: &v1.ContainerStateRunning{},
},
},
},
},
pspFound: true,
updateErr: nil,
stAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2),
},
},
stDefaultCPUSet: cpuset.NewCPUSet(5, 6, 7),
lastUpdateStAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2),
},
},
lastUpdateStDefaultCPUSet: cpuset.NewCPUSet(5, 6, 7),
expectStAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2),
},
},
expectStDefaultCPUSet: cpuset.NewCPUSet(5, 6, 7),
expectSucceededContainerName: "fakeContainerName",
expectFailedContainerName: "",
},
{
description: "cpu manager reconcile - last update state is not current",
policy: testPolicy,
activePods: []*v1.Pod{
{
ObjectMeta: metav1.ObjectMeta{
Name: "fakePodName",
UID: "fakePodUID",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "fakeContainerName",
},
},
},
},
},
pspPS: v1.PodStatus{
ContainerStatuses: []v1.ContainerStatus{
{
Name: "fakeContainerName",
ContainerID: "docker://fakeContainerID",
State: v1.ContainerState{
Running: &v1.ContainerStateRunning{},
},
},
},
},
pspFound: true,
updateErr: nil,
stAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2),
},
},
stDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7),
lastUpdateStAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(3, 4),
},
},
lastUpdateStDefaultCPUSet: cpuset.NewCPUSet(1, 2, 5, 6, 7),
expectStAssignments: state.ContainerCPUAssignments{
"fakePodUID": map[string]cpuset.CPUSet{
"fakeContainerName": cpuset.NewCPUSet(1, 2),
},
},
expectStDefaultCPUSet: cpuset.NewCPUSet(3, 4, 5, 6, 7),
expectSucceededContainerName: "fakeContainerName",
expectFailedContainerName: "",
},
} }
for _, testCase := range testCases { for _, testCase := range testCases {
mgr := &manager{ mgr := &manager{
policy: &mockPolicy{ policy: testCase.policy,
err: nil,
},
state: &mockState{ state: &mockState{
assignments: testCase.stAssignments, assignments: testCase.stAssignments,
defaultCPUSet: testCase.stDefaultCPUSet, defaultCPUSet: testCase.stDefaultCPUSet,
@ -956,6 +1181,18 @@ func TestReconcileState(t *testing.T) {
mgr.sourcesReady = &sourcesReadyStub{} mgr.sourcesReady = &sourcesReadyStub{}
success, failure := mgr.reconcileState() success, failure := mgr.reconcileState()
if !reflect.DeepEqual(testCase.expectStAssignments, mgr.state.GetCPUAssignments()) {
t.Errorf("%v", testCase.description)
t.Errorf("Expected state container cpu assignments: %v, actual: %v", testCase.expectStAssignments, mgr.state.GetCPUAssignments())
}
if !reflect.DeepEqual(testCase.expectStDefaultCPUSet, mgr.state.GetDefaultCPUSet()) {
t.Errorf("%v", testCase.description)
t.Errorf("Expected state default cpuset: %v, actual: %v", testCase.expectStDefaultCPUSet, mgr.state.GetDefaultCPUSet())
}
if testCase.expectSucceededContainerName != "" { if testCase.expectSucceededContainerName != "" {
// Search succeeded reconciled containers for the supplied name. // Search succeeded reconciled containers for the supplied name.
foundSucceededContainer := false foundSucceededContainer := false