Skip to content

Commit 3cb1134

Browse files
jschwinger233CMGS
andcommitted
refactor: intro NodeMeta and ScheduleInfo (#289)
* bugfix: avoid numa caluclate issue * split node meta from node and nodeinfo * clean useless nodeinfo data * types.NodeInfo -> resources.types.ScheduleInfo Co-authored-by: CMGS <ilskdw@gmail.com>
1 parent 7f2f209 commit 3cb1134

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1233
-1051
lines changed

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ unit-test:
4646
./auth/simple/... \
4747
./cluster/calcium/... \
4848
./discovery/helium... \
49+
./resources/types/. \
4950
./resources/storage/... \
5051
./resources/volume/... \
5152
./resources/cpumem/...

cluster/calcium/build_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ func TestBuild(t *testing.T) {
7474
assert.Error(t, err)
7575
engine := &enginemocks.API{}
7676
node := &types.Node{
77-
Name: "test",
78-
Podname: "testpod",
77+
NodeMeta: types.NodeMeta{
78+
Name: "test",
79+
Podname: "testpod",
80+
},
7981
Available: true,
8082
Engine: engine,
8183
}

cluster/calcium/capacity_test.go

+14-11
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
enginemocks "github.com/projecteru2/core/engine/mocks"
88
lockmocks "github.com/projecteru2/core/lock/mocks"
9+
resourcetypes "github.com/projecteru2/core/resources/types"
910
"github.com/projecteru2/core/scheduler"
1011
schedulermocks "github.com/projecteru2/core/scheduler/mocks"
1112
storemocks "github.com/projecteru2/core/store/mocks"
@@ -24,9 +25,11 @@ func TestCalculateCapacity(t *testing.T) {
2425

2526
// pod1 := &types.Pod{Name: "p1"}
2627
node1 := &types.Node{
27-
Name: "n1",
28+
NodeMeta: types.NodeMeta{
29+
Name: "n1",
30+
CPU: types.CPUMap{"0": 100, "1": 100},
31+
},
2832
Engine: engine,
29-
CPU: types.CPUMap{"0": 100, "1": 100},
3033
}
3134
store.On("GetNode", mock.Anything, mock.Anything).Return(node1, nil)
3235
lock := &lockmocks.DistributedLock{}
@@ -48,19 +51,19 @@ func TestCalculateCapacity(t *testing.T) {
4851
opts.ResourceOpts.CPUQuotaRequest = 0.5
4952
opts.Count = 5
5053
sched := c.scheduler.(*schedulermocks.Scheduler)
51-
// define nodesInfo
52-
nodesInfo := []types.NodeInfo{
54+
// define scheduleInfos
55+
scheduleInfos := []resourcetypes.ScheduleInfo{
5356
{
54-
Name: "n1",
55-
MemCap: 100,
56-
Deploy: 5,
57+
NodeMeta: types.NodeMeta{
58+
Name: "n1",
59+
MemCap: 100,
60+
},
5761
Capacity: 10,
58-
Count: 1,
5962
},
6063
}
61-
sched.On("SelectMemoryNodes", mock.Anything, mock.Anything, mock.Anything).Return(nodesInfo, 5, nil)
62-
sched.On("SelectStorageNodes", mock.Anything, mock.Anything).Return(nodesInfo, 5, nil)
63-
sched.On("SelectVolumeNodes", mock.Anything, mock.Anything).Return(nodesInfo, nil, 5, nil)
64+
sched.On("SelectMemoryNodes", mock.Anything, mock.Anything, mock.Anything).Return(scheduleInfos, 5, nil)
65+
sched.On("SelectStorageNodes", mock.Anything, mock.Anything).Return(scheduleInfos, 5, nil)
66+
sched.On("SelectVolumeNodes", mock.Anything, mock.Anything).Return(scheduleInfos, nil, 5, nil)
6467
store.On("MakeDeployStatus", mock.Anything, mock.Anything, mock.Anything).Return(nil)
6568
r, err := c.CalculateCapacity(ctx, opts)
6669
assert.NoError(t, err)

cluster/calcium/create_test.go

+19-11
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
enginemocks "github.com/projecteru2/core/engine/mocks"
99
enginetypes "github.com/projecteru2/core/engine/types"
1010
lockmocks "github.com/projecteru2/core/lock/mocks"
11+
resourcetypes "github.com/projecteru2/core/resources/types"
1112
"github.com/projecteru2/core/scheduler"
1213
schedulermocks "github.com/projecteru2/core/scheduler/mocks"
1314
storemocks "github.com/projecteru2/core/store/mocks"
@@ -76,11 +77,15 @@ func TestCreateWorkloadTxn(t *testing.T) {
7677

7778
pod1 := &types.Pod{Name: "p1"}
7879
node1 := &types.Node{
79-
Name: "n1",
80+
NodeMeta: types.NodeMeta{
81+
Name: "n1",
82+
},
8083
Engine: engine,
8184
}
8285
node2 := &types.Node{
83-
Name: "n2",
86+
NodeMeta: types.NodeMeta{
87+
Name: "n2",
88+
},
8489
Engine: engine,
8590
}
8691
nodes := []*types.Node{node1, node2}
@@ -107,18 +112,21 @@ func TestCreateWorkloadTxn(t *testing.T) {
107112
}
108113
return
109114
}, nil)
110-
sche.On("SelectStorageNodes", mock.AnythingOfType("[]types.NodeInfo"), mock.AnythingOfType("int64")).Return(func(nodesInfo []types.NodeInfo, _ int64) []types.NodeInfo {
111-
return nodesInfo
115+
sche.On("SelectStorageNodes", mock.AnythingOfType("[]resourcetypes.ScheduleInfo"), mock.AnythingOfType("int64")).Return(func(scheduleInfos []resourcetypes.ScheduleInfo, _ int64) []resourcetypes.ScheduleInfo {
116+
return scheduleInfos
112117
}, len(nodes), nil)
113-
sche.On("SelectVolumeNodes", mock.AnythingOfType("[]types.NodeInfo"), mock.AnythingOfType("types.VolumeBindings")).Return(func(nodesInfo []types.NodeInfo, _ types.VolumeBindings) []types.NodeInfo {
114-
return nodesInfo
118+
sche.On("SelectStorageNodes", mock.AnythingOfType("[]types.ScheduleInfo"), mock.AnythingOfType("int64")).Return(func(scheduleInfos []resourcetypes.ScheduleInfo, _ int64) []resourcetypes.ScheduleInfo {
119+
return scheduleInfos
120+
}, len(nodes), nil)
121+
sche.On("SelectVolumeNodes", mock.AnythingOfType("[]types.ScheduleInfo"), mock.AnythingOfType("types.VolumeBindings")).Return(func(scheduleInfos []resourcetypes.ScheduleInfo, _ types.VolumeBindings) []resourcetypes.ScheduleInfo {
122+
return scheduleInfos
115123
}, nil, len(nodes), nil)
116-
sche.On("SelectMemoryNodes", mock.AnythingOfType("[]types.NodeInfo"), mock.AnythingOfType("float64"), mock.AnythingOfType("int64")).Return(
117-
func(nodesInfo []types.NodeInfo, _ float64, _ int64) []types.NodeInfo {
118-
for i := range nodesInfo {
119-
nodesInfo[i].Capacity = 1
124+
sche.On("SelectMemoryNodes", mock.AnythingOfType("[]types.ScheduleInfo"), mock.AnythingOfType("float64"), mock.AnythingOfType("int64")).Return(
125+
func(scheduleInfos []resourcetypes.ScheduleInfo, _ float64, _ int64) []resourcetypes.ScheduleInfo {
126+
for i := range scheduleInfos {
127+
scheduleInfos[i].Capacity = 1
120128
}
121-
return nodesInfo
129+
return scheduleInfos
122130
}, len(nodes), nil)
123131
store.On("MakeDeployStatus", mock.Anything, mock.Anything, mock.Anything).Return(
124132
errors.Wrap(context.DeadlineExceeded, "MakeDeployStatus"),

cluster/calcium/dissociate_test.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ func TestDissociateWorkload(t *testing.T) {
3636
}
3737

3838
node1 := &types.Node{
39-
Name: "node1",
40-
MemCap: units.GiB,
41-
CPU: types.CPUMap{"0": 10, "1": 70, "2": 10, "3": 100},
42-
Endpoint: "http://1.1.1.1:1",
39+
NodeMeta: types.NodeMeta{
40+
Name: "node1",
41+
MemCap: units.GiB,
42+
CPU: types.CPUMap{"0": 10, "1": 70, "2": 10, "3": 100},
43+
Endpoint: "http://1.1.1.1:1",
44+
},
4345
}
4446

4547
store.On("GetWorkloads", mock.Anything, mock.Anything).Return([]*types.Workload{c1}, nil)

cluster/calcium/image_test.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ func TestRemoveImage(t *testing.T) {
2929
engine := &enginemocks.API{}
3030
nodes := []*types.Node{
3131
{
32-
Name: "test",
32+
NodeMeta: types.NodeMeta{
33+
Name: "test",
34+
},
3335
Engine: engine,
3436
},
3537
}
@@ -70,7 +72,9 @@ func TestCacheImage(t *testing.T) {
7072
engine := &enginemocks.API{}
7173
nodes := []*types.Node{
7274
{
73-
Name: "test",
75+
NodeMeta: types.NodeMeta{
76+
Name: "test",
77+
},
7478
Engine: engine,
7579
},
7680
}

cluster/calcium/lock_test.go

+10-6
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,11 @@ func TestWithNodesLocked(t *testing.T) {
122122
c.store = store
123123

124124
node1 := &types.Node{
125-
Name: "test",
126-
Labels: map[string]string{
127-
"eru": "1",
125+
NodeMeta: types.NodeMeta{
126+
Name: "test",
127+
Labels: map[string]string{
128+
"eru": "1",
129+
},
128130
},
129131
Available: true,
130132
}
@@ -176,9 +178,11 @@ func TestWithNodeLocked(t *testing.T) {
176178
c.store = store
177179

178180
node1 := &types.Node{
179-
Name: "test",
180-
Labels: map[string]string{
181-
"eru": "1",
181+
NodeMeta: types.NodeMeta{
182+
Name: "test",
183+
Labels: map[string]string{
184+
"eru": "1",
185+
},
182186
},
183187
Available: true,
184188
}

cluster/calcium/network_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ func TestNetwork(t *testing.T) {
3030
// vaild
3131
engine := &enginemocks.API{}
3232
node := &types.Node{
33-
Name: "test",
33+
NodeMeta: types.NodeMeta{
34+
Name: "test",
35+
},
3436
Available: true,
3537
Engine: engine,
3638
}

cluster/calcium/node_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func TestAddNode(t *testing.T) {
1616
ctx := context.Background()
1717
name := "test"
1818
node := &types.Node{
19-
Name: name,
19+
NodeMeta: types.NodeMeta{Name: name},
2020
}
2121

2222
store := &storemocks.Store{}
@@ -38,7 +38,7 @@ func TestRemoveNode(t *testing.T) {
3838
ctx := context.Background()
3939

4040
name := "test"
41-
node := &types.Node{Name: name}
41+
node := &types.Node{NodeMeta: types.NodeMeta{Name: name}}
4242
store := &storemocks.Store{}
4343
lock := &lockmocks.DistributedLock{}
4444
lock.On("Lock", mock.Anything).Return(nil)
@@ -64,8 +64,8 @@ func TestListPodNodes(t *testing.T) {
6464
name1 := "test1"
6565
name2 := "test2"
6666
nodes := []*types.Node{
67-
{Name: name1, Available: true},
68-
{Name: name2, Available: false},
67+
{NodeMeta: types.NodeMeta{Name: name1}, Available: true},
68+
{NodeMeta: types.NodeMeta{Name: name2}, Available: false},
6969
}
7070

7171
store := &storemocks.Store{}
@@ -88,7 +88,7 @@ func TestGetNode(t *testing.T) {
8888
ctx := context.Background()
8989
name := "test"
9090
node := &types.Node{
91-
Name: name,
91+
NodeMeta: types.NodeMeta{Name: name},
9292
}
9393

9494
store := &storemocks.Store{}
@@ -104,7 +104,7 @@ func TestSetNode(t *testing.T) {
104104
c := NewTestCluster()
105105
ctx := context.Background()
106106
name := "test"
107-
node := &types.Node{Name: name}
107+
node := &types.Node{NodeMeta: types.NodeMeta{Name: name}}
108108
node.Init()
109109

110110
store := &storemocks.Store{}

cluster/calcium/pod_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func TestRemovePod(t *testing.T) {
3434
store := &storemocks.Store{}
3535
c.store = store
3636
store.On("RemovePod", mock.Anything, mock.Anything).Return(nil)
37-
node := &types.Node{Name: "n1", Available: true}
37+
node := &types.Node{NodeMeta: types.NodeMeta{Name: "n1"}, Available: true}
3838
store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*types.Node{node}, nil)
3939
store.On("GetNode", mock.Anything, mock.Anything).Return(node, nil)
4040
lock := &lockmocks.DistributedLock{}

cluster/calcium/realloc_test.go

+40-32
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,17 @@ func TestRealloc(t *testing.T) {
4444
engine.On("VirtualizationInspect", mock.Anything, mock.Anything).Return(&enginetypes.VirtualizationInfo{}, nil)
4545

4646
node1 := &types.Node{
47-
Name: "node1",
48-
MemCap: int64(units.GiB),
49-
CPU: types.CPUMap{"0": 10, "1": 70, "2": 10, "3": 100},
50-
InitCPU: types.CPUMap{"0": 100, "1": 100, "2": 100, "3": 100},
51-
Engine: engine,
52-
Endpoint: "http://1.1.1.1:1",
53-
NUMA: types.NUMA{"2": "0"},
54-
NUMAMemory: types.NUMAMemory{"0": 100000},
55-
Volume: types.VolumeMap{"/dir0": 100},
47+
NodeMeta: types.NodeMeta{
48+
Name: "node1",
49+
MemCap: int64(units.GiB),
50+
CPU: types.CPUMap{"0": 10, "1": 70, "2": 10, "3": 100},
51+
InitCPU: types.CPUMap{"0": 100, "1": 100, "2": 100, "3": 100},
52+
Endpoint: "http://1.1.1.1:1",
53+
NUMA: types.NUMA{"2": "0"},
54+
NUMAMemory: types.NUMAMemory{"0": 100000},
55+
Volume: types.VolumeMap{"/dir0": 100},
56+
},
57+
Engine: engine,
5658
}
5759

5860
newC1 := func(context.Context, []string) []*types.Workload {
@@ -149,11 +151,13 @@ func TestRealloc(t *testing.T) {
149151
engine.On("VirtualizationUpdateResource", mock.Anything, mock.Anything, mock.Anything).Return(types.ErrBadWorkloadID).Once()
150152
// reset node
151153
node1 = &types.Node{
152-
Name: "node1",
153-
MemCap: int64(units.GiB),
154-
CPU: types.CPUMap{"0": 10, "1": 70, "2": 10, "3": 100},
155-
Engine: engine,
156-
Endpoint: "http://1.1.1.1:1",
154+
NodeMeta: types.NodeMeta{
155+
Name: "node1",
156+
MemCap: int64(units.GiB),
157+
CPU: types.CPUMap{"0": 10, "1": 70, "2": 10, "3": 100},
158+
Endpoint: "http://1.1.1.1:1",
159+
},
160+
Engine: engine,
157161
}
158162
store.On("GetWorkloads", mock.Anything, []string{"c2"}).Return(newC2, nil)
159163
err = c.ReallocResource(ctx, newReallocOptions("c2", 0.1, 2*int64(units.MiB), nil, types.TriKeep, types.TriKeep))
@@ -200,16 +204,18 @@ func TestRealloc(t *testing.T) {
200204
// good to go
201205
// rest everything
202206
node2 := &types.Node{
203-
Name: "node2",
204-
MemCap: int64(units.GiB),
205-
CPU: types.CPUMap{"0": 10, "1": 70, "2": 10, "3": 100},
206-
InitCPU: types.CPUMap{"0": 100, "1": 100, "2": 100, "3": 100},
207-
Engine: engine,
208-
Endpoint: "http://1.1.1.1:1",
209-
NUMA: types.NUMA{"2": "0"},
210-
NUMAMemory: types.NUMAMemory{"0": 100000},
211-
Volume: types.VolumeMap{"/dir0": 200, "/dir1": 200, "/dir2": 200},
207+
NodeMeta: types.NodeMeta{
208+
Name: "node2",
209+
MemCap: int64(units.GiB),
210+
CPU: types.CPUMap{"0": 10, "1": 70, "2": 10, "3": 100},
211+
InitCPU: types.CPUMap{"0": 100, "1": 100, "2": 100, "3": 100},
212+
Endpoint: "http://1.1.1.1:1",
213+
NUMA: types.NUMA{"2": "0"},
214+
NUMAMemory: types.NUMAMemory{"0": 100000},
215+
Volume: types.VolumeMap{"/dir0": 200, "/dir1": 200, "/dir2": 200},
216+
},
212217
VolumeUsed: int64(300),
218+
Engine: engine,
213219
}
214220
c3 := &types.Workload{
215221
ID: "c3",
@@ -306,17 +312,19 @@ func TestReallocBindCpu(t *testing.T) {
306312

307313
//test bindCpu
308314
node3 := &types.Node{
309-
Name: "node3",
310-
MemCap: int64(units.GiB),
311-
CPU: types.CPUMap{"0": 10, "1": 70, "2": 10, "3": 100},
312-
InitCPU: types.CPUMap{"0": 100, "1": 100, "2": 100, "3": 100},
315+
NodeMeta: types.NodeMeta{
316+
Name: "node3",
317+
MemCap: int64(units.GiB),
318+
CPU: types.CPUMap{"0": 10, "1": 70, "2": 10, "3": 100},
319+
InitCPU: types.CPUMap{"0": 100, "1": 100, "2": 100, "3": 100},
320+
Endpoint: "http://1.1.1.1:1",
321+
NUMA: types.NUMA{"2": "0"},
322+
NUMAMemory: types.NUMAMemory{"0": 100000},
323+
Volume: types.VolumeMap{"/dir0": 200, "/dir1": 200, "/dir2": 200},
324+
},
325+
VolumeUsed: int64(300),
313326
CPUUsed: 2.1,
314327
Engine: engine,
315-
Endpoint: "http://1.1.1.1:1",
316-
NUMA: types.NUMA{"2": "0"},
317-
NUMAMemory: types.NUMAMemory{"0": 100000},
318-
Volume: types.VolumeMap{"/dir0": 200, "/dir1": 200, "/dir2": 200},
319-
VolumeUsed: int64(300),
320328
}
321329
c5 := &types.Workload{
322330
ID: "c5",

cluster/calcium/remove_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ func TestRemoveWorkload(t *testing.T) {
4242
assert.False(t, r.Success)
4343
}
4444
node := &types.Node{
45-
Name: "test",
45+
NodeMeta: types.NodeMeta{
46+
Name: "test",
47+
},
4648
}
4749
store.On("GetNode", mock.Anything, mock.Anything).Return(node, nil)
4850
// failed by Remove

cluster/calcium/replace_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ func TestReplaceWorkload(t *testing.T) {
9292
assert.False(t, r.Remove.Success)
9393
}
9494
node := &types.Node{
95-
Name: "test",
95+
NodeMeta: types.NodeMeta{
96+
Name: "test",
97+
},
9698
}
9799
store.On("GetNode", mock.Anything, mock.Anything).Return(node, nil).Once()
98100
// failed by no image

0 commit comments

Comments
 (0)