From 284ad62394d18597db95c0d9688895090e90474d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= Date: Sun, 20 Feb 2022 10:15:48 +0100 Subject: [PATCH] Add the qemu driver to the minikube registry Since the machine drivers are hardcoded in minikube, drivers need to be added to the registry to be tested. Add a basic sanity check for the qemu-system binary, and set up the basic configuration such as cpus/memory. --- go.mod | 1 + go.sum | 2 + pkg/minikube/driver/driver.go | 2 + pkg/minikube/driver/driver_darwin.go | 2 + pkg/minikube/driver/driver_linux.go | 1 + pkg/minikube/driver/driver_test.go | 1 + pkg/minikube/driver/driver_windows.go | 1 + pkg/minikube/registry/drvs/init.go | 1 + pkg/minikube/registry/drvs/qemu/doc.go | 17 +++++ pkg/minikube/registry/drvs/qemu/qemu.go | 83 +++++++++++++++++++++++++ site/content/en/docs/drivers/_index.md | 3 + site/content/en/docs/drivers/qemu.md | 22 +++++++ 12 files changed, 136 insertions(+) create mode 100644 pkg/minikube/registry/drvs/qemu/doc.go create mode 100644 pkg/minikube/registry/drvs/qemu/qemu.go create mode 100644 site/content/en/docs/drivers/qemu.md diff --git a/go.mod b/go.mod index 0743797319..0e35693fa3 100644 --- a/go.mod +++ b/go.mod @@ -155,6 +155,7 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.13.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/machine-drivers/docker-machine-driver-qemu v0.1.0 github.com/magiconair/properties v1.8.5 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect diff --git a/go.sum b/go.sum index a3972ba0e2..c2fbcf795d 100644 --- a/go.sum +++ b/go.sum @@ -756,6 +756,8 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9 github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/machine-drivers/docker-machine-driver-qemu v0.1.0 h1:r5bMzOqca0dZuCkn/8vCM8QNpdsLPCVZ6VP5z/IU0HM= +github.com/machine-drivers/docker-machine-driver-qemu v0.1.0/go.mod h1:1gevpWYcs2Gmvt9G9T6AbeRw9tGnQdQiKt56B7n2X7g= github.com/machine-drivers/docker-machine-driver-vmware v0.1.5 h1:51GqJ84u9EBATnn8rWsHNavcuRPlCLnDmvjzZVuliwY= github.com/machine-drivers/docker-machine-driver-vmware v0.1.5/go.mod h1:dTnTzUH3uzhMo0ddV1zRjGYWcVhQWwqiHPxz5l+HPd0= github.com/machine-drivers/machine v0.7.1-0.20211105063445-78a84df85426 h1:gVDPCmqwvHQ4ox/9svvnkomYJAAiV59smbPdTK4DIm4= diff --git a/pkg/minikube/driver/driver.go b/pkg/minikube/driver/driver.go index 0b2e317c93..9bde2a0404 100644 --- a/pkg/minikube/driver/driver.go +++ b/pkg/minikube/driver/driver.go @@ -46,6 +46,8 @@ const ( SSH = "ssh" // KVM2 driver KVM2 = "kvm2" + // QEMU driver + QEMU = "qemu" // VirtualBox driver VirtualBox = "virtualbox" // HyperKit driver diff --git a/pkg/minikube/driver/driver_darwin.go b/pkg/minikube/driver/driver_darwin.go index 195f9841c0..505b97ff0b 100644 --- a/pkg/minikube/driver/driver_darwin.go +++ b/pkg/minikube/driver/driver_darwin.go @@ -27,6 +27,7 @@ var supportedDrivers = func() []string { if runtime.GOARCH == "arm64" { // on darwin/arm64 only docker and ssh are supported yet return []string{ + QEMU, Docker, Podman, SSH, @@ -50,6 +51,7 @@ var supportedDrivers = func() []string { VMwareFusion, HyperKit, VMware, + QEMU, Docker, Podman, SSH, diff --git a/pkg/minikube/driver/driver_linux.go b/pkg/minikube/driver/driver_linux.go index a428a9a2bf..9a5b4695ab 100644 --- a/pkg/minikube/driver/driver_linux.go +++ b/pkg/minikube/driver/driver_linux.go @@ -25,6 +25,7 @@ var supportedDrivers = []string{ VirtualBox, VMwareFusion, KVM2, + QEMU, VMware, None, Docker, diff --git a/pkg/minikube/driver/driver_test.go b/pkg/minikube/driver/driver_test.go index 021f78c74c..52b0be0f71 100644 --- a/pkg/minikube/driver/driver_test.go +++ b/pkg/minikube/driver/driver_test.go @@ -66,6 +66,7 @@ func TestMachineType(t *testing.T) { None: "bare metal machine", SSH: "bare metal machine", KVM2: "VM", + QEMU: "VM", VirtualBox: "VM", HyperKit: "VM", VMware: "VM", diff --git a/pkg/minikube/driver/driver_windows.go b/pkg/minikube/driver/driver_windows.go index 8352366ae2..473ee45ae9 100644 --- a/pkg/minikube/driver/driver_windows.go +++ b/pkg/minikube/driver/driver_windows.go @@ -32,6 +32,7 @@ var supportedDrivers = []string{ VMwareFusion, HyperV, VMware, + QEMU, Docker, Podman, SSH, diff --git a/pkg/minikube/registry/drvs/init.go b/pkg/minikube/registry/drvs/init.go index 06b1115827..40c9ff18a5 100644 --- a/pkg/minikube/registry/drvs/init.go +++ b/pkg/minikube/registry/drvs/init.go @@ -25,6 +25,7 @@ import ( _ "k8s.io/minikube/pkg/minikube/registry/drvs/none" _ "k8s.io/minikube/pkg/minikube/registry/drvs/parallels" _ "k8s.io/minikube/pkg/minikube/registry/drvs/podman" + _ "k8s.io/minikube/pkg/minikube/registry/drvs/qemu" _ "k8s.io/minikube/pkg/minikube/registry/drvs/ssh" _ "k8s.io/minikube/pkg/minikube/registry/drvs/virtualbox" _ "k8s.io/minikube/pkg/minikube/registry/drvs/vmware" diff --git a/pkg/minikube/registry/drvs/qemu/doc.go b/pkg/minikube/registry/drvs/qemu/doc.go new file mode 100644 index 0000000000..ea4425ce8d --- /dev/null +++ b/pkg/minikube/registry/drvs/qemu/doc.go @@ -0,0 +1,17 @@ +/* +Copyright 2018 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package qemu diff --git a/pkg/minikube/registry/drvs/qemu/qemu.go b/pkg/minikube/registry/drvs/qemu/qemu.go new file mode 100644 index 0000000000..bd4b9e7eca --- /dev/null +++ b/pkg/minikube/registry/drvs/qemu/qemu.go @@ -0,0 +1,83 @@ +/* +Copyright 2018 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package qemu + +import ( + "fmt" + "os/exec" + "runtime" + + "github.com/docker/machine/libmachine/drivers" + drvqemu "github.com/machine-drivers/docker-machine-driver-qemu" + + "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/download" + "k8s.io/minikube/pkg/minikube/driver" + "k8s.io/minikube/pkg/minikube/localpath" + "k8s.io/minikube/pkg/minikube/registry" +) + +const ( + docURL = "https://minikube.sigs.k8s.io/docs/reference/drivers/qemu/" +) + +func init() { + if err := registry.Register(registry.DriverDef{ + Name: driver.QEMU, + Config: configure, + Status: status, + Default: true, + Priority: registry.Experimental, + }); err != nil { + panic(fmt.Sprintf("register failed: %v", err)) + } +} + +func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) { + name := config.MachineName(cc, n) + return drvqemu.Driver{ + BaseDriver: &drivers.BaseDriver{ + MachineName: name, + StorePath: localpath.MiniPath(), + SSHUser: "docker", + }, + Boot2DockerURL: download.LocalISOResource(cc.MinikubeISO), + DiskSize: cc.DiskSize, + Memory: cc.Memory, + CPU: cc.CPUs, + }, nil +} + +func status() registry.State { + var qemuSystem string + arch := runtime.GOARCH + switch arch { + case "amd64": + qemuSystem = "qemu-system-x86_64" + case "arm64": + qemuSystem = "qemu-system-aarch64" + default: + return registry.State{Error: fmt.Errorf("unknown arch: %s", arch), Doc: docURL} + } + + _, err := exec.LookPath(qemuSystem) + if err != nil { + return registry.State{Error: err, Fix: "Install qemu-system", Doc: docURL} + } + + return registry.State{Installed: true, Healthy: true, Running: true} +} diff --git a/site/content/en/docs/drivers/_index.md b/site/content/en/docs/drivers/_index.md index daf996e84f..6744c03ff3 100644 --- a/site/content/en/docs/drivers/_index.md +++ b/site/content/en/docs/drivers/_index.md @@ -17,6 +17,7 @@ To do so, we use the [Docker Machine](https://github.com/docker/machine) library * [Docker]({{}}) - container-based (preferred) * [KVM2]({{}}) - VM-based (preferred) * [VirtualBox]({{}}) - VM +* [QEMU]({{}}) - VM (experimental) * [None]({{}}) - bare-metal * [Podman]({{}}) - container (experimental) * [SSH]({{}}) - remote ssh @@ -29,6 +30,7 @@ To do so, we use the [Docker Machine](https://github.com/docker/machine) library * [VirtualBox]({{}}) - VM * [Parallels]({{}}) - VM * [VMware Fusion]({{}}) - VM +* [QEMU]({{}}) - VM (experimental) * [SSH]({{}}) - remote ssh ## Windows @@ -37,4 +39,5 @@ To do so, we use the [Docker Machine](https://github.com/docker/machine) library * [Docker]({{}}) - VM + Container (preferred) * [VirtualBox]({{}}) - VM * [VMware Workstation]({{}}) - VM +* [QEMU]({{}}) - VM (experimental) * [SSH]({{}}) - remote ssh diff --git a/site/content/en/docs/drivers/qemu.md b/site/content/en/docs/drivers/qemu.md new file mode 100644 index 0000000000..23167b1e5b --- /dev/null +++ b/site/content/en/docs/drivers/qemu.md @@ -0,0 +1,22 @@ +--- +title: "qemu" +weight: 3 +description: > + QEMU driver +aliases: + - /docs/reference/drivers/qemu +--- + +## Overview + +The `qemu` driver users QEMU (system) for VM creation. + + + +## Issues + +* [Full list of open 'qemu' driver issues](https://github.com/kubernetes/minikube/labels/co%2Fqemu-driver) + +## Troubleshooting + +* Run `minikube start --alsologtostderr -v=4` to debug crashes