Merge pull request #4161 from afbjorklund/machine-env

Handle environment variables from podman-machine
This commit is contained in:
OpenShift Merge Robot
2019-10-03 12:45:43 -07:00
committed by GitHub
8 changed files with 65 additions and 17 deletions

View File

@ -42,6 +42,8 @@ type MainFlags struct {
ConnectionName string ConnectionName string
RemoteConfigFilePath string RemoteConfigFilePath string
Port int Port int
IdentityFile string
IgnoreHosts bool
} }
type AttachValues struct { type AttachValues struct {

View File

@ -3,9 +3,11 @@
package main package main
import ( import (
"github.com/pkg/errors" "os"
"os/user" "os/user"
"strconv"
"github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -13,14 +15,32 @@ const remote = true
func init() { func init() {
var username string var username string
if curruser, err := user.Current(); err == nil { if username = os.Getenv("PODMAN_USER"); username == "" {
username = curruser.Username if curruser, err := user.Current(); err == nil {
username = curruser.Username
}
}
host := os.Getenv("PODMAN_HOST")
port := 22
if portstr := os.Getenv("PODMAN_PORT"); portstr != "" {
if p, err := strconv.Atoi(portstr); err == nil {
port = p
}
}
key := os.Getenv("PODMAN_IDENTITY_FILE")
ignore := false
if ignorestr := os.Getenv("PODMAN_IGNORE_HOSTS"); ignorestr != "" {
if b, err := strconv.ParseBool(ignorestr); err == nil {
ignore = b
}
} }
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.ConnectionName, "connection", "", "remote connection name") rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.ConnectionName, "connection", "", "remote connection name")
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteConfigFilePath, "remote-config-path", "", "alternate path for configuration file") rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteConfigFilePath, "remote-config-path", "", "alternate path for configuration file")
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteUserName, "username", username, "username on the remote host") rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteUserName, "username", username, "username on the remote host")
rootCmd.PersistentFlags().IntVar(&MainGlobalOpts.Port, "port", 22, "port on remote host") rootCmd.PersistentFlags().IntVar(&MainGlobalOpts.Port, "port", port, "port on remote host")
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteHost, "remote-host", "", "remote host") rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.RemoteHost, "remote-host", host, "remote host")
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.IdentityFile, "identity-file", key, "identity-file")
rootCmd.PersistentFlags().BoolVar(&MainGlobalOpts.IgnoreHosts, "ignore-hosts", ignore, "ignore hosts")
// TODO maybe we allow the altering of this for bridge connections? // TODO maybe we allow the altering of this for bridge connections?
// rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.VarlinkAddress, "varlink-address", adapter.DefaultAddress, "address of the varlink socket") // rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.VarlinkAddress, "varlink-address", adapter.DefaultAddress, "address of the varlink socket")
rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.LogLevel, "log-level", "error", "Log messages above specified level: debug, info, warn, error, fatal or panic. Logged to ~/.config/containers/podman.log") rootCmd.PersistentFlags().StringVar(&MainGlobalOpts.LogLevel, "log-level", "error", "Log messages above specified level: debug, info, warn, error, fatal or panic. Logged to ~/.config/containers/podman.log")

View File

@ -9,10 +9,12 @@ type RemoteConfig struct {
// RemoteConnection describes the attributes of a podman-remote endpoint // RemoteConnection describes the attributes of a podman-remote endpoint
type RemoteConnection struct { type RemoteConnection struct {
Destination string `toml:"destination"` Destination string `toml:"destination"`
Username string `toml:"username"` Username string `toml:"username"`
IsDefault bool `toml:"default"` IsDefault bool `toml:"default"`
Port int `toml:"port"` Port int `toml:"port"`
IdentityFile string `toml:"identity_file"`
IgnoreHosts bool `toml:"ignore_hosts"`
} }
// GetConfigFilePath is a simple helper to export the configuration file's // GetConfigFilePath is a simple helper to export the configuration file's

View File

@ -143,7 +143,7 @@ func TestRemoteConfig_GetDefault(t *testing.T) {
wantErr bool wantErr bool
}{ }{
// A good toml should return the connection that is marked isDefault // A good toml should return the connection that is marked isDefault
{"good", fields{Connections: makeGoodResult().Connections}, &RemoteConnection{"192.168.1.1", "myuser", true, 22}, false}, {"good", fields{Connections: makeGoodResult().Connections}, &RemoteConnection{"192.168.1.1", "myuser", true, 22, "", false}, false},
// If nothing is marked as isDefault and there is more than one connection, error should occur // If nothing is marked as isDefault and there is more than one connection, error should occur
{"nodefault", fields{Connections: noDefault}, nil, true}, {"nodefault", fields{Connections: noDefault}, nil, true},
// if nothing is marked as isDefault but there is only one connection, the one connection is considered the default // if nothing is marked as isDefault but there is only one connection, the one connection is considered the default
@ -183,9 +183,9 @@ func TestRemoteConfig_GetRemoteConnection(t *testing.T) {
wantErr bool wantErr bool
}{ }{
// Good connection // Good connection
{"goodhomer", fields{Connections: makeGoodResult().Connections}, args{name: "homer"}, &RemoteConnection{"192.168.1.1", "myuser", true, 22}, false}, {"goodhomer", fields{Connections: makeGoodResult().Connections}, args{name: "homer"}, &RemoteConnection{"192.168.1.1", "myuser", true, 22, "", false}, false},
// Good connection // Good connection
{"goodbart", fields{Connections: makeGoodResult().Connections}, args{name: "bart"}, &RemoteConnection{"foobar.com", "root", false, 22}, false}, {"goodbart", fields{Connections: makeGoodResult().Connections}, args{name: "bart"}, &RemoteConnection{"foobar.com", "root", false, 22, "", false}, false},
// Getting an unknown connection should result in error // Getting an unknown connection should result in error
{"noexist", fields{Connections: makeGoodResult().Connections}, args{name: "foobar"}, nil, true}, {"noexist", fields{Connections: makeGoodResult().Connections}, args{name: "foobar"}, nil, true},
// Getting a connection when there are none should result in an error // Getting a connection when there are none should result in an error

View File

@ -25,6 +25,12 @@ of the user's remote connections.
**port** = int **port** = int
Use an alternative port for the ssh connections. The default port is 22. Use an alternative port for the ssh connections. The default port is 22.
**identity_file** = ""
Use an alternative location for the ssh private key
**ignore_hosts** = bool
Don't match the remote ssh host key with known hosts
## EXAMPLE ## EXAMPLE

View File

@ -35,7 +35,7 @@ func (r RemoteRuntime) RemoteEndpoint() (remoteEndpoint *Endpoint, err error) {
if len(r.cmd.RemoteUserName) < 1 { if len(r.cmd.RemoteUserName) < 1 {
return nil, errors.New("you must provide a username when providing a remote host name") return nil, errors.New("you must provide a username when providing a remote host name")
} }
rc := remoteclientconfig.RemoteConnection{r.cmd.RemoteHost, r.cmd.RemoteUserName, false, r.cmd.Port} rc := remoteclientconfig.RemoteConnection{r.cmd.RemoteHost, r.cmd.RemoteUserName, false, r.cmd.Port, r.cmd.IdentityFile, r.cmd.IgnoreHosts}
remoteEndpoint, err = newBridgeConnection("", &rc, r.cmd.LogLevel) remoteEndpoint, err = newBridgeConnection("", &rc, r.cmd.LogLevel)
// if the user has a config file with connections in it // if the user has a config file with connections in it
} else if len(remoteConfigConnections.Connections) > 0 { } else if len(remoteConfigConnections.Connections) > 0 {

View File

@ -14,7 +14,14 @@ func formatDefaultBridge(remoteConn *remoteclientconfig.RemoteConnection, logLev
if port == 0 { if port == 0 {
port = 22 port = 22
} }
options := ""
if remoteConn.IdentityFile != "" {
options += " -i " + remoteConn.IdentityFile
}
if remoteConn.IgnoreHosts {
options += " -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
}
return fmt.Sprintf( return fmt.Sprintf(
`ssh -p %d -T %s@%s -- /usr/bin/varlink -A \'/usr/bin/podman --log-level=%s varlink \\\$VARLINK_ADDRESS\' bridge`, `ssh -p %d -T%s %s@%s -- varlink -A \'podman --log-level=%s varlink \\\$VARLINK_ADDRESS\' bridge`,
port, remoteConn.Username, remoteConn.Destination, logLevel) port, options, remoteConn.Username, remoteConn.Destination, logLevel)
} }

View File

@ -9,7 +9,18 @@ import (
) )
func formatDefaultBridge(remoteConn *remoteclientconfig.RemoteConnection, logLevel string) string { func formatDefaultBridge(remoteConn *remoteclientconfig.RemoteConnection, logLevel string) string {
port := remoteConn.Port
if port == 0 {
port = 22
}
options := ""
if remoteConn.IdentityFile != "" {
options += " -i " + remoteConn.IdentityFile
}
if remoteConn.IgnoreHosts {
options += " -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
}
return fmt.Sprintf( return fmt.Sprintf(
`ssh -T %s@%s -- /usr/bin/varlink -A '/usr/bin/podman --log-level=%s varlink $VARLINK_ADDRESS' bridge`, `ssh -p %d -T%s %s@%s -- varlink -A 'podman --log-level=%s varlink $VARLINK_ADDRESS' bridge`,
remoteConn.Username, remoteConn.Destination, logLevel) port, options, remoteConn.Username, remoteConn.Destination, logLevel)
} }