[lxc-devel] [lxd/master] VM: Add freeze/unfreeze and file removal
stgraber on Github
lxc-bot at linuxcontainers.org
Fri Nov 29 22:07:54 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20191129/98dae053/attachment.bin>
-------------- next part --------------
From 6a1c1d9e719af8be4978d598424a205772dfc965 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 29 Nov 2019 16:41:31 -0500
Subject: [PATCH 1/4] lxd/vm: Implement freeze/unfreeze
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/qmp/monitor.go | 5 +++++
lxd/vm_qemu.go | 28 +++++++++++++++++++++++++++-
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/lxd/qmp/monitor.go b/lxd/qmp/monitor.go
index 3a1ad4343c..79a2692519 100644
--- a/lxd/qmp/monitor.go
+++ b/lxd/qmp/monitor.go
@@ -268,6 +268,11 @@ func (m *Monitor) Start() error {
return m.runCmd("cont")
}
+// Pause tells QEMU to temporarily stop the emulation.
+func (m *Monitor) Pause() error {
+ return m.runCmd("stop")
+}
+
// Quit tells QEMU to exit immediately.
func (m *Monitor) Quit() error {
return m.runCmd("quit")
diff --git a/lxd/vm_qemu.go b/lxd/vm_qemu.go
index 053063beb4..3efa91e1f0 100644
--- a/lxd/vm_qemu.go
+++ b/lxd/vm_qemu.go
@@ -430,6 +430,18 @@ func (vm *vmQemu) generateAgentCert() (string, string, string, string, error) {
}
func (vm *vmQemu) Freeze() error {
+ // Connect to the monitor.
+ monitor, err := qmp.Connect(vm.getMonitorPath(), vm.getMonitorEventHandler())
+ if err != nil {
+ return err
+ }
+
+ // Send the stop command.
+ err = monitor.Pause()
+ if err != nil {
+ return err
+ }
+
return nil
}
@@ -1431,7 +1443,19 @@ func (vm *vmQemu) Stop(stateful bool) error {
}
func (vm *vmQemu) Unfreeze() error {
- return fmt.Errorf("Unfreeze Not implemented")
+ // Connect to the monitor.
+ monitor, err := qmp.Connect(vm.getMonitorPath(), vm.getMonitorEventHandler())
+ if err != nil {
+ return err
+ }
+
+ // Send the cont command.
+ err = monitor.Start()
+ if err != nil {
+ return err
+ }
+
+ return nil
}
func (vm *vmQemu) IsPrivileged() bool {
@@ -2812,6 +2836,8 @@ func (vm *vmQemu) statusCode() api.StatusCode {
if status == "running" {
return api.Running
+ } else if status == "paused" {
+ return api.Frozen
}
return api.Stopped
From 7e0083634ae8dffeda8c31f19514faadb3b8541a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 29 Nov 2019 16:43:56 -0500
Subject: [PATCH 2/4] lxd/vm: Privileged mode doesn't apply
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/vm_qemu.go | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/lxd/vm_qemu.go b/lxd/vm_qemu.go
index 3efa91e1f0..41ecbf8385 100644
--- a/lxd/vm_qemu.go
+++ b/lxd/vm_qemu.go
@@ -1459,7 +1459,8 @@ func (vm *vmQemu) Unfreeze() error {
}
func (vm *vmQemu) IsPrivileged() bool {
- return shared.IsTrue(vm.expandedConfig["security.privileged"])
+ // Privileged mode doesn't apply to virtual machines
+ return false
}
func (vm *vmQemu) Restore(source instance.Instance, stateful bool) error {
From a7ea7e3cbb0b0bcee078f250d8bb449d8bd98e7b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 29 Nov 2019 17:05:47 -0500
Subject: [PATCH 3/4] client: Add agent version of DeleteInstanceFile
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
client/lxd_instances.go | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/client/lxd_instances.go b/client/lxd_instances.go
index 9b042d469c..340a4b9bf5 100644
--- a/client/lxd_instances.go
+++ b/client/lxd_instances.go
@@ -1109,17 +1109,31 @@ func (r *ProtocolLXD) CreateInstanceFile(instanceName string, filePath string, a
// DeleteInstanceFile deletes a file in the instance.
func (r *ProtocolLXD) DeleteInstanceFile(instanceName string, filePath string) error {
- path, _, err := r.instanceTypeToPath(api.InstanceTypeAny)
- if err != nil {
- return err
- }
-
if !r.HasExtension("file_delete") {
return fmt.Errorf("The server is missing the required \"file_delete\" API extension")
}
+ var requestURL string
+
+ if r.IsAgent() {
+ requestURL = fmt.Sprintf("/files?path=%s", url.QueryEscape(filePath))
+ } else {
+ path, _, err := r.instanceTypeToPath(api.InstanceTypeAny)
+ if err != nil {
+ return err
+ }
+
+ // Prepare the HTTP request
+ requestURL = fmt.Sprintf("%s/%s/files?path=%s", path, url.PathEscape(instanceName), url.QueryEscape(filePath))
+ }
+
+ requestURL, err := r.setQueryAttributes(requestURL)
+ if err != nil {
+ return err
+ }
+
// Send the request
- _, _, err = r.query("DELETE", fmt.Sprintf("%s/%s/files?path=%s", path, url.PathEscape(instanceName), url.QueryEscape(filePath)), nil, "")
+ _, _, err = r.query("DELETE", requestURL, nil, "")
if err != nil {
return err
}
From 0788330915ff9327af0b30f6b82be5da5cd9be1e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 29 Nov 2019 17:05:58 -0500
Subject: [PATCH 4/4] lxd/vm: Add FileRemove support
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/vm_qemu.go | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/lxd/vm_qemu.go b/lxd/vm_qemu.go
index 41ecbf8385..284ef6df37 100644
--- a/lxd/vm_qemu.go
+++ b/lxd/vm_qemu.go
@@ -2305,7 +2305,25 @@ func (vm *vmQemu) FilePush(fileType string, srcPath string, dstPath string, uid
}
func (vm *vmQemu) FileRemove(path string) error {
- return fmt.Errorf("FileRemove Not implemented")
+ // Connect to the agent.
+ client, err := vm.getAgentClient()
+ if err != nil {
+ return err
+ }
+
+ agent, err := lxdClient.ConnectLXDHTTP(nil, client)
+ if err != nil {
+ return fmt.Errorf("Failed to connect to lxd-agent")
+ }
+ defer agent.Disconnect()
+
+ // Delete instance file.
+ err = agent.DeleteInstanceFile("", path)
+ if err != nil {
+ return err
+ }
+
+ return nil
}
func (vm *vmQemu) Console() (*os.File, chan error, error) {
More information about the lxc-devel
mailing list