Files
podman/pkg/machine/config.go
Ashley Cui e766113737 Add --execute flag to podman machine ssh
--execute, -e allows to execute a command through ssh

Signed-off-by: Ashley Cui <acui@redhat.com>
2021-03-25 08:46:43 -05:00

136 lines
2.9 KiB
Go

package machine
import (
"net"
"net/url"
"os"
"path/filepath"
"github.com/containers/storage/pkg/homedir"
)
type CreateOptions struct {
Name string
CPUS uint64
Memory uint64
IgnitionPath string
ImagePath string
Username string
URI url.URL
IsDefault bool
//KernelPath string
//Devices []VMDevices
}
type RemoteConnectionType string
var (
SSHRemoteConnection RemoteConnectionType = "ssh"
DefaultIgnitionUserName = "core"
)
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
}
type SSHOptions struct {
Execute bool
Args []string
}
type StartOptions struct{}
type StopOptions struct{}
type DestroyOptions struct {
Force bool
SaveKeys bool
SaveImage bool
SaveIgnition bool
}
type VM interface {
Create(opts CreateOptions) error
Destroy(name string, opts DestroyOptions) (string, func() error, error)
SSH(name string, opts SSHOptions) error
Start(name string, opts StartOptions) error
Stop(name string, opts StopOptions) error
}
type DistributionDownload interface {
DownloadImage() error
Get() *Download
}
// TODO is this even needed?
type TestVM struct{}
func (vm *TestVM) Create(opts CreateOptions) error {
return nil
}
func (vm *TestVM) Start(name string, opts StartOptions) error {
return nil
}
func (vm *TestVM) Stop(name string, opts StopOptions) error {
return nil
}
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: "",
RawFragment: "",
}
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
}