@@ -18,6 +18,7 @@ package goproxmox
1818
1919import (
2020 "context"
21+ "fmt"
2122 "net/http"
2223 "testing"
2324
@@ -150,3 +151,115 @@ func TestProxmoxAPIClient_GetReservableMemoryBytes(t *testing.T) {
150151 })
151152 }
152153}
154+
155+ func TestProxmoxAPIClient_CloudInitStatus (t * testing.T ) {
156+ tests := []struct {
157+ name string
158+ node string // node name
159+ vmid int64 // vmid
160+ pid float64 // pid of agent
161+ exited int // exited state
162+ exitcode int // exitcode
163+ outData string // out-data
164+ running bool // expected running state
165+ err error // expected error
166+ }{
167+ {
168+ name : "cloud-init success" ,
169+ node : "pve" ,
170+ vmid : 1111 ,
171+ pid : 12234 ,
172+ exited : 1 ,
173+ exitcode : 0 ,
174+ outData : "status: done\n " ,
175+ running : false ,
176+ err : nil ,
177+ },
178+ {
179+ name : "cloud-init running" ,
180+ node : "pve" ,
181+ vmid : 1111 ,
182+ pid : 12234 ,
183+ exited : 1 ,
184+ exitcode : 0 ,
185+ outData : "status: running\n " ,
186+ running : true ,
187+ err : nil ,
188+ },
189+ {
190+ name : "cloud-init failed" ,
191+ node : "pve" ,
192+ vmid : 1111 ,
193+ pid : 12234 ,
194+ exited : 1 ,
195+ exitcode : 1 ,
196+ outData : "status: error\n " ,
197+ running : false ,
198+ err : ErrCloudInitFailed ,
199+ },
200+ }
201+
202+ for _ , test := range tests {
203+ t .Run (test .name , func (t * testing.T ) {
204+ client := newTestClient (t )
205+
206+ httpmock .RegisterResponder (http .MethodGet , fmt .Sprintf (`=~/nodes/%s/status` , test .node ),
207+ newJSONResponder (200 , proxmox.Node {Name : "pve" }))
208+
209+ httpmock .RegisterResponder (http .MethodGet , fmt .Sprintf (`=~/nodes/%s/qemu/%d/status/current` , test .node , test .vmid ),
210+ newJSONResponder (200 , proxmox.VirtualMachine {
211+ VMID : proxmox .StringOrUint64 (test .vmid ),
212+ Name : "legit-worker" ,
213+ Node : test .node ,
214+ }))
215+
216+ httpmock .RegisterResponder (http .MethodGet , fmt .Sprintf (`=~/nodes/%s/qemu/%d/config` , test .node , test .vmid ),
217+ newJSONResponder (200 , proxmox.VirtualMachineConfig {
218+ Name : "legit-worker" ,
219+ }))
220+
221+ vm , err := client .GetVM (context .Background (), test .node , test .vmid )
222+ require .NoError (t , err )
223+ require .NotNil (t , vm )
224+
225+ // WaitForAgent mock
226+ httpmock .RegisterResponder (http .MethodGet , fmt .Sprintf (`=~/nodes/%s/qemu/%d/agent/get-osinfo` , vm .Node , vm .VMID ),
227+ newJSONResponder (200 ,
228+ map [string ]* proxmox.AgentOsInfo {
229+ "result" : {
230+ ID : "ubuntu" ,
231+ VersionID : "22.04" ,
232+ Machine : "x86_64" ,
233+ KernelRelease : "5.15.0-89-generic" ,
234+ KernelVersion : "#99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023" ,
235+ Name : "Ubuntu" ,
236+ Version : "22.04.3 LTS (Jammy Jellyfish)" ,
237+ PrettyName : "Ubuntu 22.04.3 LTS" ,
238+ },
239+ },
240+ ))
241+
242+ // AgentExec mock
243+ httpmock .RegisterResponder (http .MethodPost , fmt .Sprintf (`=~/nodes/%s/qemu/%d/agent/exec\z` , vm .Node , vm .VMID ),
244+ newJSONResponder (200 ,
245+ map [string ]interface {}{
246+ "pid" : test .pid ,
247+ },
248+ ))
249+
250+ // AgentExecStatus mock
251+ httpmock .RegisterResponder (http .MethodGet , fmt .Sprintf (`=~/nodes/%s/qemu/%d/agent/exec-status\?pid=%v` , vm .Node , vm .VMID , test .pid ),
252+ newJSONResponder (200 ,
253+ & proxmox.AgentExecStatus {
254+ Exited : test .exited ,
255+ ExitCode : test .exitcode ,
256+ OutData : test .outData ,
257+ },
258+ ))
259+
260+ running , err := client .CloudInitStatus (context .Background (), vm )
261+ require .Equal (t , err , test .err )
262+ require .Equal (t , test .running , running )
263+ })
264+ }
265+ }
0 commit comments