The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7494

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
This is prep work for `lxc console` GUI support.
From 02cf2eee9267cbdfe60a720c46f08316657e1a01 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Sat, 6 Jun 2020 21:30:32 -0400
Subject: [PATCH 1/3] lxd/vm: Rename some functions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/instance/drivers/driver_qemu.go | 32 ++++++++++++++---------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/lxd/instance/drivers/driver_qemu.go 
b/lxd/instance/drivers/driver_qemu.go
index a90e65fd5a..5079f9e7be 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -468,7 +468,7 @@ func (vm *qemu) generateAgentCert() (string, string, 
string, string, error) {
 // Freeze freezes the instance.
 func (vm *qemu) Freeze() error {
        // Connect to the monitor.
-       monitor, err := qmp.Connect(vm.getMonitorPath(), 
vm.getMonitorEventHandler())
+       monitor, err := qmp.Connect(vm.monitorPath(), 
vm.getMonitorEventHandler())
        if err != nil {
                return err
        }
@@ -493,7 +493,7 @@ func (vm *qemu) onStop(target string) error {
        // Cleanup.
        vm.cleanupDevices()
        os.Remove(vm.pidFilePath())
-       os.Remove(vm.getMonitorPath())
+       os.Remove(vm.monitorPath())
        vm.unmount()
 
        // Record power state.
@@ -530,7 +530,7 @@ func (vm *qemu) Shutdown(timeout time.Duration) error {
        }
 
        // Connect to the monitor.
-       monitor, err := qmp.Connect(vm.getMonitorPath(), 
vm.getMonitorEventHandler())
+       monitor, err := qmp.Connect(vm.monitorPath(), 
vm.getMonitorEventHandler())
        if err != nil {
                op.Done(err)
                return err
@@ -656,7 +656,7 @@ func (vm *qemu) Start(stateful bool) error {
 
        // Copy OVMF settings firmware to nvram file.
        // This firmware file can be modified by the VM so it must be copied 
from the defaults.
-       if !shared.PathExists(vm.getNvramPath()) {
+       if !shared.PathExists(vm.nvramPath()) {
                err = vm.setupNvram()
                if err != nil {
                        op.Done(err)
@@ -868,7 +868,7 @@ func (vm *qemu) Start(stateful bool) error {
        })
 
        // Start QMP monitoring.
-       monitor, err := qmp.Connect(vm.getMonitorPath(), 
vm.getMonitorEventHandler())
+       monitor, err := qmp.Connect(vm.monitorPath(), 
vm.getMonitorEventHandler())
        if err != nil {
                op.Done(err)
                return err
@@ -989,8 +989,8 @@ func (vm *qemu) setupNvram() error {
                return fmt.Errorf("Required EFI firmware settings file missing: 
%s", srcOvmfFile)
        }
 
-       os.Remove(vm.getNvramPath())
-       err = shared.FileCopy(srcOvmfFile, vm.getNvramPath())
+       os.Remove(vm.nvramPath())
+       err = shared.FileCopy(srcOvmfFile, vm.nvramPath())
        if err != nil {
                return err
        }
@@ -1159,11 +1159,11 @@ func (vm *qemu) runHooks(hooks []func() error) error {
        return nil
 }
 
-func (vm *qemu) getMonitorPath() string {
+func (vm *qemu) monitorPath() string {
        return filepath.Join(vm.LogPath(), "qemu.monitor")
 }
 
-func (vm *qemu) getNvramPath() string {
+func (vm *qemu) nvramPath() string {
        return filepath.Join(vm.Path(), "qemu.nvram")
 }
 
@@ -1753,7 +1753,7 @@ func (vm *qemu) addCPUConfig(sb *strings.Builder) error {
 func (vm *qemu) addMonitorConfig(sb *strings.Builder) error {
        return qemuControlSocket.Execute(sb, map[string]interface{}{
                "architecture": vm.architectureName,
-               "path":         vm.getMonitorPath(),
+               "path":         vm.monitorPath(),
        })
 }
 
@@ -1767,7 +1767,7 @@ func (vm *qemu) addFirmwareConfig(sb *strings.Builder) 
error {
        return qemuDriveFirmware.Execute(sb, map[string]interface{}{
                "architecture": vm.architectureName,
                "roPath":       filepath.Join(vm.ovmfPath(), "OVMF_CODE.fd"),
-               "nvramPath":    vm.getNvramPath(),
+               "nvramPath":    vm.nvramPath(),
        })
 }
 
@@ -2003,7 +2003,7 @@ func (vm *qemu) Stop(stateful bool) error {
        }
 
        // Connect to the monitor.
-       monitor, err := qmp.Connect(vm.getMonitorPath(), 
vm.getMonitorEventHandler())
+       monitor, err := qmp.Connect(vm.monitorPath(), 
vm.getMonitorEventHandler())
        if err != nil {
                // If we fail to connect, it's most likely because the VM is 
already off.
                op.Done(nil)
@@ -2050,7 +2050,7 @@ func (vm *qemu) Stop(stateful bool) error {
 // Unfreeze restores the instance to running.
 func (vm *qemu) Unfreeze() error {
        // Connect to the monitor.
-       monitor, err := qmp.Connect(vm.getMonitorPath(), 
vm.getMonitorEventHandler())
+       monitor, err := qmp.Connect(vm.monitorPath(), 
vm.getMonitorEventHandler())
        if err != nil {
                return err
        }
@@ -3421,7 +3421,7 @@ func (vm *qemu) Console() (*os.File, chan error, error) {
        vmConsoleLock.Unlock()
 
        // Connect to the monitor.
-       monitor, err := qmp.Connect(vm.getMonitorPath(), 
vm.getMonitorEventHandler())
+       monitor, err := qmp.Connect(vm.monitorPath(), 
vm.getMonitorEventHandler())
        if err != nil {
                return nil, nil, err // The VM isn't running as no monitor 
socket available.
        }
@@ -3792,7 +3792,7 @@ func (vm *qemu) diskState() 
(map[string]api.InstanceStateDisk, error) {
 // an API call to get the current state.
 func (vm *qemu) agentGetState() (*api.InstanceState, error) {
        // Check if the agent is running.
-       monitor, err := qmp.Connect(vm.getMonitorPath(), 
vm.getMonitorEventHandler())
+       monitor, err := qmp.Connect(vm.monitorPath(), 
vm.getMonitorEventHandler())
        if err != nil {
                return nil, err
        }
@@ -3909,7 +3909,7 @@ func (vm *qemu) InitPID() int {
 
 func (vm *qemu) statusCode() api.StatusCode {
        // Connect to the monitor.
-       monitor, err := qmp.Connect(vm.getMonitorPath(), 
vm.getMonitorEventHandler())
+       monitor, err := qmp.Connect(vm.monitorPath(), 
vm.getMonitorEventHandler())
        if err != nil {
                // If we fail to connect, chances are the VM isn't running.
                return api.Stopped

From a49642c88632d11124555cf73ffb9ae74aa3b7bf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Sat, 6 Jun 2020 21:01:05 -0400
Subject: [PATCH 2/3] lxd/vm: Add virtio-vga card
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/instance/drivers/driver_qemu.go           | 15 +++++++++++
 lxd/instance/drivers/driver_qemu_templates.go | 25 +++++++++++++++++++
 2 files changed, 40 insertions(+)

diff --git a/lxd/instance/drivers/driver_qemu.go 
b/lxd/instance/drivers/driver_qemu.go
index 5079f9e7be..5b17f09b30 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -1633,6 +1633,13 @@ func (vm *qemu) generateQemuConfigFile(devConfs 
[]*deviceConfig.RunConfig, fdFil
                }
        }
 
+       // GPU for console.
+       err = vm.addVGAConfig(sb, chassisIndex)
+       if err != nil {
+               return "", err
+       }
+       chassisIndex++
+
        // Write the agent mount config.
        agentMountJSON, err := json.Marshal(agentMounts)
        if err != nil {
@@ -1677,6 +1684,14 @@ func (vm *qemu) addVsockConfig(sb *strings.Builder) 
error {
        })
 }
 
+// addVGAConfig adds the qemu config required for setting up the host->VM 
vsock socket.
+func (vm *qemu) addVGAConfig(sb *strings.Builder, chassisIndex int) error {
+       return qemuVGA.Execute(sb, map[string]interface{}{
+               "architecture": vm.architectureName,
+               "chassisIndex": chassisIndex,
+       })
+}
+
 // addCPUConfig adds the qemu config required for setting the number of 
virtualised CPUs.
 func (vm *qemu) addCPUConfig(sb *strings.Builder) error {
        // Default to a single core.
diff --git a/lxd/instance/drivers/driver_qemu_templates.go 
b/lxd/instance/drivers/driver_qemu_templates.go
index a32a777e9d..357cfe1d37 100644
--- a/lxd/instance/drivers/driver_qemu_templates.go
+++ b/lxd/instance/drivers/driver_qemu_templates.go
@@ -166,6 +166,31 @@ driver = "vhost-vsock-ccw"
 {{- end}}
 `))
 
+var qemuVGA = template.Must(template.New("qemuVGA").Parse(`
+# VGA
+{{if eq .architecture "x86_64" "aarch64" -}}
+[device "qemu_pcie{{.chassisIndex}}"]
+driver = "pcie-root-port"
+port = "0x4"
+chassis = "{{.chassisIndex}}"
+bus = "pcie.0"
+addr = "0x4.0x1"
+{{- end }}
+
+[device "dev-qemu_vga"]
+{{if ne .architecture "s390x" -}}
+driver = "virtio-vga"
+{{- if eq .architecture "ppc64le"}}
+bus = "pci.0"
+{{- else}}
+bus = "qemu_pcie{{.chassisIndex}}"
+addr = "0x0"
+{{- end}}
+{{- else}}
+driver = "virtio-gpu-ccw"
+{{- end}}
+`))
+
 var qemuCPU = template.Must(template.New("qemuCPU").Parse(`
 # CPU
 [smp-opts]

From 8e85aeb0d7c7b8439bb2ef5d7c018ff88c9483fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Sat, 6 Jun 2020 21:31:12 -0400
Subject: [PATCH 3/3] lxd/vm: Add spice channel
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/instance/drivers/driver_qemu.go           | 5 +++++
 lxd/instance/drivers/driver_qemu_templates.go | 6 ++++++
 2 files changed, 11 insertions(+)

diff --git a/lxd/instance/drivers/driver_qemu.go 
b/lxd/instance/drivers/driver_qemu.go
index 5b17f09b30..8510086bd8 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -1167,6 +1167,10 @@ func (vm *qemu) nvramPath() string {
        return filepath.Join(vm.Path(), "qemu.nvram")
 }
 
+func (vm *qemu) spicePath() string {
+       return filepath.Join(vm.LogPath(), "qemu.spice")
+}
+
 // generateConfigShare generates the config share directory that will be 
exported to the VM via
 // a 9P share. Due to the unknown size of templates inside the images this 
directory is created
 // inside the VM's config volume so that it can be restricted by quota.
@@ -1550,6 +1554,7 @@ func (vm *qemu) generateQemuConfigFile(devConfs 
[]*deviceConfig.RunConfig, fdFil
        err := qemuBase.Execute(sb, map[string]interface{}{
                "architecture":     vm.architectureName,
                "ringbufSizeBytes": qmp.RingbufSize,
+               "spicePath":        vm.spicePath(),
        })
        if err != nil {
                return "", err
diff --git a/lxd/instance/drivers/driver_qemu_templates.go 
b/lxd/instance/drivers/driver_qemu_templates.go
index 357cfe1d37..beccc89c66 100644
--- a/lxd/instance/drivers/driver_qemu_templates.go
+++ b/lxd/instance/drivers/driver_qemu_templates.go
@@ -132,6 +132,12 @@ driver = "virtio-rng-ccw"
 # Console
 [chardev "console"]
 backend = "pty"
+
+# Graphical console
+[spice]
+unix = "on"
+addr = "{{.spicePath}}"
+disable-ticketing = "on"
 `))
 
 var qemuMemory = template.Must(template.New("qemuMemory").Parse(`
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to