summaryrefslogtreecommitdiff
path: root/pkg/machine
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/machine')
-rw-r--r--pkg/machine/config.go2
-rw-r--r--pkg/machine/connection.go2
-rw-r--r--pkg/machine/fcos.go6
-rw-r--r--pkg/machine/fcos_amd64.go14
-rw-r--r--pkg/machine/fcos_arm64.go2
-rw-r--r--pkg/machine/ignition.go2
-rw-r--r--pkg/machine/ignition_schema.go2
-rw-r--r--pkg/machine/keys.go2
-rw-r--r--pkg/machine/libvirt/config.go6
-rw-r--r--pkg/machine/libvirt/machine.go17
-rw-r--r--pkg/machine/libvirt/machine_unsupported.go3
-rw-r--r--pkg/machine/pull.go2
-rw-r--r--pkg/machine/qemu/config.go2
-rw-r--r--pkg/machine/qemu/machine.go49
-rw-r--r--pkg/machine/qemu/options_darwin.go4
-rw-r--r--pkg/machine/qemu/options_darwin_amd64.go2
-rw-r--r--pkg/machine/qemu/options_darwin_arm64.go24
17 files changed, 81 insertions, 60 deletions
diff --git a/pkg/machine/config.go b/pkg/machine/config.go
index db9bfa7de..cad71ba49 100644
--- a/pkg/machine/config.go
+++ b/pkg/machine/config.go
@@ -1,4 +1,4 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
+// +build amd64,!windows arm64,!windows
package machine
diff --git a/pkg/machine/connection.go b/pkg/machine/connection.go
index 3edcbd10e..ed1093264 100644
--- a/pkg/machine/connection.go
+++ b/pkg/machine/connection.go
@@ -1,4 +1,4 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
+// +build amd64,!windows arm64,!windows
package machine
diff --git a/pkg/machine/fcos.go b/pkg/machine/fcos.go
index 49ec01e67..4ea965b7f 100644
--- a/pkg/machine/fcos.go
+++ b/pkg/machine/fcos.go
@@ -1,4 +1,4 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
+// +build amd64,!windows arm64,!windows
package machine
@@ -24,8 +24,8 @@ type FcosDownload struct {
Download
}
-func NewFcosDownloader(vmType, vmName string) (DistributionDownload, error) {
- info, err := getFCOSDownload()
+func NewFcosDownloader(vmType, vmName, imageStream string) (DistributionDownload, error) {
+ info, err := getFCOSDownload(imageStream)
if err != nil {
return nil, err
}
diff --git a/pkg/machine/fcos_amd64.go b/pkg/machine/fcos_amd64.go
index 36676405a..4e2e86d3e 100644
--- a/pkg/machine/fcos_amd64.go
+++ b/pkg/machine/fcos_amd64.go
@@ -8,16 +8,26 @@ import (
"github.com/coreos/stream-metadata-go/fedoracoreos"
"github.com/coreos/stream-metadata-go/stream"
+ "github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
// This should get Exported and stay put as it will apply to all fcos downloads
// getFCOS parses fedoraCoreOS's stream and returns the image download URL and the release version
-func getFCOSDownload() (*fcosDownloadInfo, error) {
+func getFCOSDownload(imageStream string) (*fcosDownloadInfo, error) {
var (
fcosstable stream.Stream
+ streamType string
)
- streamurl := fedoracoreos.GetStreamURL(fedoracoreos.StreamNext)
+ switch imageStream {
+ case "testing", "":
+ streamType = fedoracoreos.StreamNext
+ case "stable":
+ streamType = fedoracoreos.StreamStable
+ default:
+ return nil, errors.Errorf("invalid stream %s: valid streams are `testing` and `stable`", imageStream)
+ }
+ streamurl := fedoracoreos.GetStreamURL(streamType)
resp, err := http.Get(streamurl.String())
if err != nil {
return nil, err
diff --git a/pkg/machine/fcos_arm64.go b/pkg/machine/fcos_arm64.go
index f5cd5a505..f45522be0 100644
--- a/pkg/machine/fcos_arm64.go
+++ b/pkg/machine/fcos_arm64.go
@@ -13,7 +13,7 @@ const aarchBaseURL = "https://fedorapeople.org/groups/fcos-images/builds/latest/
// Total hack until automation is possible.
// We need a proper json file at least to automate
-func getFCOSDownload() (*fcosDownloadInfo, error) {
+func getFCOSDownload(imageStream string) (*fcosDownloadInfo, error) {
meta := Build{}
resp, err := http.Get(aarchBaseURL + "meta.json")
if err != nil {
diff --git a/pkg/machine/ignition.go b/pkg/machine/ignition.go
index 1d77083d0..a9289d6b3 100644
--- a/pkg/machine/ignition.go
+++ b/pkg/machine/ignition.go
@@ -1,4 +1,4 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
+// +build amd64,!windows arm64,!windows
package machine
diff --git a/pkg/machine/ignition_schema.go b/pkg/machine/ignition_schema.go
index 6ac8af826..aa4b8e060 100644
--- a/pkg/machine/ignition_schema.go
+++ b/pkg/machine/ignition_schema.go
@@ -1,4 +1,4 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
+// +build amd64,!windows arm64,!windows
package machine
diff --git a/pkg/machine/keys.go b/pkg/machine/keys.go
index 81ec44ea8..319fc2b4e 100644
--- a/pkg/machine/keys.go
+++ b/pkg/machine/keys.go
@@ -1,4 +1,4 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
+// +build amd64,!windows arm64,!windows
package machine
diff --git a/pkg/machine/libvirt/config.go b/pkg/machine/libvirt/config.go
deleted file mode 100644
index 1ce5ab154..000000000
--- a/pkg/machine/libvirt/config.go
+++ /dev/null
@@ -1,6 +0,0 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
-
-package libvirt
-
-type MachineVM struct {
-}
diff --git a/pkg/machine/libvirt/machine.go b/pkg/machine/libvirt/machine.go
deleted file mode 100644
index e1aa1569b..000000000
--- a/pkg/machine/libvirt/machine.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
-
-package libvirt
-
-import "github.com/containers/podman/v3/pkg/machine"
-
-func (v *MachineVM) Init(name string, opts machine.InitOptions) error {
- return nil
-}
-
-func (v *MachineVM) Start(name string) error {
- return nil
-}
-
-func (v *MachineVM) Stop(name string) error {
- return nil
-}
diff --git a/pkg/machine/libvirt/machine_unsupported.go b/pkg/machine/libvirt/machine_unsupported.go
deleted file mode 100644
index 8b54440fe..000000000
--- a/pkg/machine/libvirt/machine_unsupported.go
+++ /dev/null
@@ -1,3 +0,0 @@
-// +build !amd64 amd64,windows
-
-package libvirt
diff --git a/pkg/machine/pull.go b/pkg/machine/pull.go
index 662896de5..f79ac6ec4 100644
--- a/pkg/machine/pull.go
+++ b/pkg/machine/pull.go
@@ -1,4 +1,4 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
+// +build amd64,!windows arm64,!windows
package machine
diff --git a/pkg/machine/qemu/config.go b/pkg/machine/qemu/config.go
index 013f28960..3d0fa4094 100644
--- a/pkg/machine/qemu/config.go
+++ b/pkg/machine/qemu/config.go
@@ -1,4 +1,4 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
+// +build amd64,!windows arm64,!windows
package qemu
diff --git a/pkg/machine/qemu/machine.go b/pkg/machine/qemu/machine.go
index a92892957..855a39c56 100644
--- a/pkg/machine/qemu/machine.go
+++ b/pkg/machine/qemu/machine.go
@@ -1,4 +1,4 @@
-// +build amd64,linux arm64,linux amd64,darwin arm64,darwin
+// +build amd64,!windows arm64,!windows
package qemu
@@ -138,29 +138,29 @@ func (v *MachineVM) Init(opts machine.InitOptions) error {
jsonFile := filepath.Join(vmConfigDir, v.Name) + ".json"
v.IdentityPath = filepath.Join(sshDir, v.Name)
- // The user has provided an alternate image which can be a file path
- // or URL.
- if len(opts.ImagePath) > 0 {
- g, err := machine.NewGenericDownloader(vmtype, v.Name, opts.ImagePath)
+ switch opts.ImagePath {
+ case "testing", "stable", "":
+ // Get image as usual
+ dd, err := machine.NewFcosDownloader(vmtype, v.Name, opts.ImagePath)
if err != nil {
return err
}
- v.ImagePath = g.Get().LocalUncompressedFile
- if err := g.DownloadImage(); err != nil {
+ v.ImagePath = dd.Get().LocalUncompressedFile
+ if err := dd.DownloadImage(); err != nil {
return err
}
- } else {
- // Get the image as usual
- dd, err := machine.NewFcosDownloader(vmtype, v.Name)
+ default:
+ // The user has provided an alternate image which can be a file path
+ // or URL.
+ g, err := machine.NewGenericDownloader(vmtype, v.Name, opts.ImagePath)
if err != nil {
return err
}
- v.ImagePath = dd.Get().LocalUncompressedFile
- if err := dd.DownloadImage(); err != nil {
+ v.ImagePath = g.Get().LocalUncompressedFile
+ if err := g.DownloadImage(); err != nil {
return err
}
}
-
// Add arch specific options including image location
v.CmdLine = append(v.CmdLine, v.addArchOptions()...)
@@ -244,6 +244,7 @@ func (v *MachineVM) Start(name string, _ machine.StartOptions) error {
qemuSocketConn net.Conn
wait time.Duration = time.Millisecond * 500
)
+
if err := v.startHostNetworking(); err != nil {
return errors.Errorf("unable to start host networking: %q", err)
}
@@ -264,7 +265,11 @@ func (v *MachineVM) Start(name string, _ machine.StartOptions) error {
if err != nil {
return err
}
-
+ // If the qemusocketpath exists and the vm is off/down, we should rm
+ // it before the dial as to avoid a segv
+ if err := os.Remove(qemuSocketPath); err != nil && !errors.Is(err, os.ErrNotExist) {
+ logrus.Warn(err)
+ }
for i := 0; i < 6; i++ {
qemuSocketConn, err = net.Dial("unix", qemuSocketPath)
if err == nil {
@@ -273,6 +278,9 @@ func (v *MachineVM) Start(name string, _ machine.StartOptions) error {
time.Sleep(wait)
wait++
}
+ if err != nil {
+ return err
+ }
fd, err := qemuSocketConn.(*net.UnixConn).File()
if err != nil {
@@ -352,7 +360,7 @@ func (v *MachineVM) Stop(name string, _ machine.StopOptions) error {
if _, err = qmpMonitor.Run(input); err != nil {
return err
}
- _, pidFile, err := v.getSocketandPid()
+ qemuSocketFile, pidFile, err := v.getSocketandPid()
if err != nil {
return err
}
@@ -373,7 +381,16 @@ func (v *MachineVM) Stop(name string, _ machine.StopOptions) error {
if p == nil && err != nil {
return err
}
- return p.Kill()
+ // Kill the process
+ if err := p.Kill(); err != nil {
+ return err
+ }
+ // Remove the pidfile
+ if err := os.Remove(pidFile); err != nil && !errors.Is(err, os.ErrNotExist) {
+ logrus.Warn(err)
+ }
+ // Remove socket
+ return os.Remove(qemuSocketFile)
}
// NewQMPMonitor creates the monitor subsection of our vm
diff --git a/pkg/machine/qemu/options_darwin.go b/pkg/machine/qemu/options_darwin.go
index 440937131..124358db8 100644
--- a/pkg/machine/qemu/options_darwin.go
+++ b/pkg/machine/qemu/options_darwin.go
@@ -2,14 +2,12 @@ package qemu
import (
"os"
-
- "github.com/pkg/errors"
)
func getRuntimeDir() (string, error) {
tmpDir, ok := os.LookupEnv("TMPDIR")
if !ok {
- return "", errors.New("unable to resolve TMPDIR")
+ tmpDir = "/tmp"
}
return tmpDir, nil
}
diff --git a/pkg/machine/qemu/options_darwin_amd64.go b/pkg/machine/qemu/options_darwin_amd64.go
index ee1036291..ff8d10db1 100644
--- a/pkg/machine/qemu/options_darwin_amd64.go
+++ b/pkg/machine/qemu/options_darwin_amd64.go
@@ -5,7 +5,7 @@ var (
)
func (v *MachineVM) addArchOptions() []string {
- opts := []string{"-machine", "q35,accel=hvf:tcg"}
+ opts := []string{"-machine", "q35,accel=hvf:tcg", "-cpu", "host"}
return opts
}
diff --git a/pkg/machine/qemu/options_darwin_arm64.go b/pkg/machine/qemu/options_darwin_arm64.go
index 7513b3048..43cd3d69d 100644
--- a/pkg/machine/qemu/options_darwin_arm64.go
+++ b/pkg/machine/qemu/options_darwin_arm64.go
@@ -1,6 +1,7 @@
package qemu
import (
+ "os"
"os/exec"
"path/filepath"
)
@@ -13,9 +14,10 @@ func (v *MachineVM) addArchOptions() []string {
ovmfDir := getOvmfDir(v.ImagePath, v.Name)
opts := []string{
"-accel", "hvf",
+ "-accel", "tcg",
"-cpu", "cortex-a57",
"-M", "virt,highmem=off",
- "-drive", "file=/usr/local/share/qemu/edk2-aarch64-code.fd,if=pflash,format=raw,readonly=on",
+ "-drive", "file=" + getEdk2CodeFd("edk2-aarch64-code.fd") + ",if=pflash,format=raw,readonly=on",
"-drive", "file=" + ovmfDir + ",if=pflash,format=raw"}
return opts
}
@@ -34,3 +36,23 @@ func (v *MachineVM) archRemovalFiles() []string {
func getOvmfDir(imagePath, vmName string) string {
return filepath.Join(filepath.Dir(imagePath), vmName+"_ovmf_vars.fd")
}
+
+/*
+ * QEmu can be installed in multiple locations on MacOS, especially on
+ * Apple Silicon systems. A build from source will likely install it in
+ * /usr/local/bin, whereas Homebrew package management standard is to
+ * install in /opt/homebrew
+ */
+func getEdk2CodeFd(name string) string {
+ dirs := []string{
+ "/usr/local/share/qemu",
+ "/opt/homebrew/share/qemu",
+ }
+ for _, dir := range dirs {
+ fullpath := filepath.Join(dir, name)
+ if _, err := os.Stat(fullpath); err == nil {
+ return fullpath
+ }
+ }
+ return name
+}