mirror of
https://github.com/containers/podman.git
synced 2025-06-01 01:00:22 +08:00

* Enable support of virtfs in Podman and darwin. At the time of this writing, it requires a special patch not yet included in upstream qemu. * Prefer to use a specially built qemu to support virtfs. The qemu is installed under libexec/podman. [NO NEW TESTS NEEDED] Signed-off-by: Brent Baude <bbaude@redhat.com>
178 lines
4.2 KiB
Go
178 lines
4.2 KiB
Go
//go:build amd64 || arm64
|
|
// +build amd64 arm64
|
|
|
|
package machine
|
|
|
|
import (
|
|
"net"
|
|
"net/url"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/containers/storage/pkg/homedir"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type InitOptions struct {
|
|
CPUS uint64
|
|
DiskSize uint64
|
|
IgnitionPath string
|
|
ImagePath string
|
|
Volumes []string
|
|
VolumeDriver string
|
|
IsDefault bool
|
|
Memory uint64
|
|
Name string
|
|
TimeZone string
|
|
URI url.URL
|
|
Username string
|
|
ReExec bool
|
|
Rootful bool
|
|
// The numberical userid of the user that called machine
|
|
UID string
|
|
}
|
|
|
|
type QemuMachineStatus = string
|
|
|
|
const (
|
|
// Running indicates the qemu vm is running
|
|
Running QemuMachineStatus = "running"
|
|
// Stopped indicates the vm has stopped
|
|
Stopped QemuMachineStatus = "stopped"
|
|
DefaultMachineName string = "podman-machine-default"
|
|
)
|
|
|
|
type Provider interface {
|
|
NewMachine(opts InitOptions) (VM, error)
|
|
LoadVMByName(name string) (VM, error)
|
|
List(opts ListOptions) ([]*ListResponse, error)
|
|
IsValidVMName(name string) (bool, error)
|
|
CheckExclusiveActiveVM() (bool, string, error)
|
|
}
|
|
|
|
type RemoteConnectionType string
|
|
|
|
var (
|
|
SSHRemoteConnection RemoteConnectionType = "ssh"
|
|
DefaultIgnitionUserName = "core"
|
|
ErrNoSuchVM = errors.New("VM does not exist")
|
|
ErrVMAlreadyExists = errors.New("VM already exists")
|
|
ErrVMAlreadyRunning = errors.New("VM already running")
|
|
ErrMultipleActiveVM = errors.New("only one VM can be active at a time")
|
|
ForwarderBinaryName = "gvproxy"
|
|
)
|
|
|
|
type Download struct {
|
|
Arch string
|
|
Artifact string
|
|
CompressionType string
|
|
Format string
|
|
ImageName string `json:"image_name"`
|
|
LocalPath string
|
|
LocalUncompressedFile string
|
|
Sha256sum string
|
|
URL *url.URL
|
|
VMName string
|
|
Size int64
|
|
}
|
|
|
|
type ListOptions struct{}
|
|
|
|
type ListResponse struct {
|
|
Name string
|
|
CreatedAt time.Time
|
|
LastUp time.Time
|
|
Running bool
|
|
Stream string
|
|
VMType string
|
|
CPUs uint64
|
|
Memory uint64
|
|
DiskSize uint64
|
|
Port int
|
|
RemoteUsername string
|
|
IdentityPath string
|
|
}
|
|
|
|
type SetOptions struct {
|
|
Rootful bool
|
|
}
|
|
|
|
type SSHOptions struct {
|
|
Username string
|
|
Args []string
|
|
}
|
|
type StartOptions struct{}
|
|
|
|
type StopOptions struct{}
|
|
|
|
type RemoveOptions struct {
|
|
Force bool
|
|
SaveKeys bool
|
|
SaveImage bool
|
|
SaveIgnition bool
|
|
}
|
|
|
|
type VM interface {
|
|
Init(opts InitOptions) (bool, error)
|
|
Remove(name string, opts RemoveOptions) (string, func() error, error)
|
|
Set(name string, opts SetOptions) error
|
|
SSH(name string, opts SSHOptions) error
|
|
Start(name string, opts StartOptions) error
|
|
Stop(name string, opts StopOptions) error
|
|
}
|
|
|
|
type DistributionDownload interface {
|
|
HasUsableCache() (bool, error)
|
|
Get() *Download
|
|
}
|
|
|
|
func (rc RemoteConnectionType) MakeSSHURL(host, path, port, userName string) url.URL {
|
|
userInfo := url.User(userName)
|
|
uri := url.URL{
|
|
Scheme: "ssh",
|
|
Opaque: "",
|
|
User: userInfo,
|
|
Host: host,
|
|
Path: path,
|
|
RawPath: "",
|
|
ForceQuery: false,
|
|
RawQuery: "",
|
|
Fragment: "",
|
|
}
|
|
if len(port) > 0 {
|
|
uri.Host = net.JoinHostPort(uri.Hostname(), port)
|
|
}
|
|
return uri
|
|
}
|
|
|
|
// GetDataDir returns the filepath where vm images should
|
|
// live for podman-machine
|
|
func GetDataDir(vmType string) (string, error) {
|
|
data, err := homedir.GetDataHome()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
dataDir := filepath.Join(data, "containers", "podman", "machine", vmType)
|
|
if _, err := os.Stat(dataDir); !os.IsNotExist(err) {
|
|
return dataDir, nil
|
|
}
|
|
mkdirErr := os.MkdirAll(dataDir, 0755)
|
|
return dataDir, mkdirErr
|
|
}
|
|
|
|
// GetConfigDir returns the filepath to where configuration
|
|
// files for podman-machine should live
|
|
func GetConfDir(vmType string) (string, error) {
|
|
conf, err := homedir.GetConfigHome()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
confDir := filepath.Join(conf, "containers", "podman", "machine", vmType)
|
|
if _, err := os.Stat(confDir); !os.IsNotExist(err) {
|
|
return confDir, nil
|
|
}
|
|
mkdirErr := os.MkdirAll(confDir, 0755)
|
|
return confDir, mkdirErr
|
|
}
|