Compare commits
2 commits
0.1.0rc007
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
a3b85f5926 |
|||
|
4ab880a32d |
1 changed files with 25 additions and 17 deletions
|
|
@ -33,25 +33,18 @@ func StopVM(db *badger.DB, name string, cfg *configuration.Config) error {
|
||||||
|
|
||||||
socketPath := filepath.Join(cfg.QEMU.QMPDir, name+".sock")
|
socketPath := filepath.Join(cfg.QEMU.QMPDir, name+".sock")
|
||||||
|
|
||||||
if _, err := qmp.Send(socketPath, []string{`{"execute":"system_powerdown"}`}); err != nil {
|
if _, err := os.Stat(socketPath); err == nil {
|
||||||
return fmt.Errorf("qmp system_powerdown: %w", err)
|
// socket présent : tenter l'arrêt gracieux
|
||||||
}
|
if _, err := qmp.Send(socketPath, []string{`{"execute":"system_powerdown"}`}); err == nil {
|
||||||
|
waitQMPDead(socketPath,
|
||||||
// attendre l'arrêt effectif de la VM ; forcer via quit après timeout
|
time.Duration(cfg.Dispatcher.TimeoutSeconds)*time.Second,
|
||||||
timeout := time.After(time.Duration(cfg.Dispatcher.TimeoutSeconds) * time.Second)
|
time.Duration(cfg.Dispatcher.PollSeconds)*time.Second,
|
||||||
poll := time.Duration(cfg.Dispatcher.PollSeconds) * time.Second
|
)
|
||||||
stopped := false
|
|
||||||
for !stopped {
|
|
||||||
select {
|
|
||||||
case <-timeout:
|
|
||||||
qmp.Send(socketPath, []string{`{"execute":"quit"}`})
|
|
||||||
stopped = true
|
|
||||||
case <-time.After(poll):
|
|
||||||
if _, err := qmp.Send(socketPath, nil); err != nil {
|
|
||||||
stopped = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// connexion QMP échouée : QEMU déjà mort
|
||||||
}
|
}
|
||||||
|
// socket absent ou QEMU déjà arrêté : cleanup direct
|
||||||
|
|
||||||
|
|
||||||
if err := netns.Call(d.vpcName, func() error {
|
if err := netns.Call(d.vpcName, func() error {
|
||||||
return iptables.DeleteMetadataRedirect(d.ip, d.interfaceIP, d.metadataPort)
|
return iptables.DeleteMetadataRedirect(d.ip, d.interfaceIP, d.metadataPort)
|
||||||
|
|
@ -74,3 +67,18 @@ func StopVM(db *badger.DB, name string, cfg *configuration.Config) error {
|
||||||
|
|
||||||
return kv.AddInDB(db, "vm/"+name+"/state", "stopped")
|
return kv.AddInDB(db, "vm/"+name+"/state", "stopped")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func waitQMPDead(socketPath string, timeout, poll time.Duration) {
|
||||||
|
timer := time.After(timeout)
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-timer:
|
||||||
|
qmp.Send(socketPath, []string{`{"execute":"quit"}`})
|
||||||
|
return
|
||||||
|
case <-time.After(poll):
|
||||||
|
if _, err := qmp.Send(socketPath, nil); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue