Skip to content

Commit db7ace8

Browse files
authored
fix: exclude VM templates and include containers when calculating a host's reserveable memory (#40)
Previously, it was only checked for VMs, without taking their Template status into consideration. (A Template VM can't be started, without explicitly removing the flag.). Existing LXCs on a host weren't taken into consideration either. Now, we'll no longer include VM Template in our calculations. But in exchange we include LXCs now. Fixes #36.
1 parent a1666e4 commit db7ace8

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

pkg/proxmox/goproxmox/api_client.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,30 @@ func (c *APIClient) GetReservableMemoryBytes(ctx context.Context, nodeName strin
195195
}
196196

197197
for _, vm := range vms {
198+
// Ignore VM Templates, as they can't be started.
199+
if vm.Template {
200+
continue
201+
}
198202
if reservableMemory < vm.MaxMem {
199203
reservableMemory = 0
200204
} else {
201205
reservableMemory -= vm.MaxMem
202206
}
203207
}
204208

209+
containers, err := node.Containers(ctx)
210+
if err != nil {
211+
return 0, fmt.Errorf("cannot list containers for node %s: %w", nodeName, err)
212+
}
213+
214+
for _, ct := range containers {
215+
if reservableMemory < ct.MaxMem {
216+
reservableMemory = 0
217+
} else {
218+
reservableMemory -= ct.MaxMem
219+
}
220+
}
221+
205222
return reservableMemory, nil
206223
}
207224

pkg/proxmox/goproxmox/api_client_test.go

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,45 @@ func TestProxmoxAPIClient_GetReservableMemoryBytes(t *testing.T) {
6464
newJSONResponder(200, proxmox.Node{Memory: proxmox.Memory{Total: 30}}))
6565

6666
httpmock.RegisterResponder(http.MethodGet, `=~/nodes/test/qemu`,
67-
newJSONResponder(200, proxmox.VirtualMachines{{MaxMem: test.maxMem}}))
67+
// Somehow, setting proxmox.VirtualMachines{} ALWAYS has `Template: true` when defined this way.
68+
// So it's better to just define a legitimate json response
69+
newJSONResponder(200, []interface{}{
70+
map[string]interface{}{
71+
"name": "legit-worker",
72+
"maxmem": test.maxMem,
73+
"vmid": 1111,
74+
"diskwrite": 0,
75+
"mem": 0,
76+
"uptime": 0,
77+
"disk": 0,
78+
"cpu": 0,
79+
"cpus": 1,
80+
"status": "stopped",
81+
"netout": 0,
82+
"maxdisk": 0,
83+
"netin": 0,
84+
"diskread": 0,
85+
},
86+
map[string]interface{}{
87+
"name": "template",
88+
"maxmem": 102400,
89+
"vmid": 2222,
90+
"diskwrite": 0,
91+
"mem": 0,
92+
"uptime": 0,
93+
"disk": 0,
94+
"cpu": 0,
95+
"template": 1,
96+
"cpus": 1,
97+
"status": "stopped",
98+
"netout": 0,
99+
"maxdisk": 0,
100+
"netin": 0,
101+
"diskread": 0,
102+
}}))
103+
104+
httpmock.RegisterResponder(http.MethodGet, `=~/nodes/test/lxc`,
105+
newJSONResponder(200, proxmox.Containers{}))
68106

69107
reservable, err := client.GetReservableMemoryBytes(context.Background(), "test")
70108
require.NoError(t, err)

0 commit comments

Comments
 (0)