[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