-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support (m)TLS API Socket #24601
base: main
Are you sure you want to change the base?
Support (m)TLS API Socket #24601
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,7 +27,7 @@ var ( | |
"destination" is one of the form: | ||
[user@]hostname (will default to ssh) | ||
ssh://[user@]hostname[:port][/path] (will obtain socket path from service, if not given.) | ||
tcp://hostname:port (not secured) | ||
tcp://hostname:port (not secured without TLS enabled) | ||
unix://path (absolute path required) | ||
`, | ||
RunE: add, | ||
|
@@ -36,6 +36,7 @@ var ( | |
podman system connection add --identity ~/.ssh/dev_rsa testing ssh://[email protected]:2222 | ||
podman system connection add --identity ~/.ssh/dev_rsa --port 22 production [email protected] | ||
podman system connection add debug tcp://localhost:8080 | ||
podman system connection add production-tls --tls-ca=ca.crt --tls-cert=tls.crt --tls-key=tls.key tcp://localhost:8080 | ||
`, | ||
} | ||
|
||
|
@@ -51,11 +52,14 @@ var ( | |
dockerPath string | ||
|
||
cOpts = struct { | ||
Identity string | ||
Port int | ||
UDSPath string | ||
Default bool | ||
Farm string | ||
Identity string | ||
Port int | ||
UDSPath string | ||
Default bool | ||
Farm string | ||
TLSCertFile string | ||
TLSKeyFile string | ||
TLSCAFile string | ||
}{} | ||
) | ||
|
||
|
@@ -74,6 +78,18 @@ func init() { | |
flags.StringVar(&cOpts.Identity, identityFlagName, "", "path to SSH identity file") | ||
_ = addCmd.RegisterFlagCompletionFunc(identityFlagName, completion.AutocompleteDefault) | ||
|
||
tlsCertFileFlagName := "tls-cert" | ||
flags.StringVar(&cOpts.TLSCertFile, tlsCertFileFlagName, "", "path to TLS client certificate PEM file") | ||
_ = addCmd.RegisterFlagCompletionFunc(tlsCertFileFlagName, completion.AutocompleteDefault) | ||
|
||
tlsKeyFileFlagName := "tls-key" | ||
flags.StringVar(&cOpts.TLSKeyFile, tlsKeyFileFlagName, "", "path to TLS client certificate private key PEM file") | ||
_ = addCmd.RegisterFlagCompletionFunc(tlsKeyFileFlagName, completion.AutocompleteDefault) | ||
|
||
tlsCAFileFlagName := "tls-ca" | ||
flags.StringVar(&cOpts.TLSCAFile, tlsCAFileFlagName, "", "path to TLS certificate Authority PEM file") | ||
_ = addCmd.RegisterFlagCompletionFunc(tlsCAFileFlagName, completion.AutocompleteDefault) | ||
|
||
socketPathFlagName := "socket-path" | ||
flags.StringVar(&cOpts.UDSPath, socketPathFlagName, "", "path to podman socket on remote host. (default '/run/podman/podman.sock' or '/run/user/{uid}/podman/podman.sock)") | ||
_ = addCmd.RegisterFlagCompletionFunc(socketPathFlagName, completion.AutocompleteDefault) | ||
|
@@ -139,14 +155,24 @@ func add(cmd *cobra.Command, args []string) error { | |
return fmt.Errorf("invalid ssh mode") | ||
} | ||
|
||
if uri.Scheme != "tcp" { | ||
if cmd.Flags().Changed("tls-cert") { | ||
return fmt.Errorf("--tls-cert option not supported for %s scheme", uri.Scheme) | ||
} | ||
if cmd.Flags().Changed("tls-key") { | ||
return fmt.Errorf("--tls-key option not supported for %s scheme", uri.Scheme) | ||
} | ||
if cmd.Flags().Changed("tls-ca") { | ||
return fmt.Errorf("--tls-ca option not supported for %s scheme", uri.Scheme) | ||
} | ||
} | ||
switch uri.Scheme { | ||
case "ssh": | ||
return ssh.Create(entities, sshMode) | ||
case "unix": | ||
if cmd.Flags().Changed("identity") { | ||
return errors.New("--identity option not supported for unix scheme") | ||
} | ||
|
||
if cmd.Flags().Changed("socket-path") { | ||
uri.Path = cmd.Flag("socket-path").Value.String() | ||
} | ||
|
@@ -169,6 +195,9 @@ func add(cmd *cobra.Command, args []string) error { | |
if cmd.Flags().Changed("identity") { | ||
return errors.New("--identity option not supported for tcp scheme") | ||
} | ||
if cmd.Flags().Changed("tls-cert") != cmd.Flags().Changed("tls-key") { | ||
return errors.New("--tls-cert and --tls-key options must be both provided if one is provided") | ||
} | ||
if uri.Port() == "" { | ||
return errors.New("tcp scheme requires a port either via --port or in destination URL") | ||
} | ||
|
@@ -177,8 +206,11 @@ func add(cmd *cobra.Command, args []string) error { | |
} | ||
|
||
dst := config.Destination{ | ||
URI: uri.String(), | ||
Identity: cOpts.Identity, | ||
URI: uri.String(), | ||
Identity: cOpts.Identity, | ||
TLSCertFile: cOpts.TLSCertFile, | ||
TLSKeyFile: cOpts.TLSKeyFile, | ||
TLSCAFile: cOpts.TLSCAFile, | ||
} | ||
|
||
connection := args[0] | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -118,19 +118,22 @@ func inspect(cmd *cobra.Command, args []string) error { | |
rpt, err = rpt.Parse(report.OriginUser, format) | ||
} else { | ||
rpt, err = rpt.Parse(report.OriginPodman, | ||
"{{range .}}{{.Name}}\t{{.URI}}\t{{.Identity}}\t{{.Default}}\t{{.ReadWrite}}\n{{end -}}") | ||
"{{range .}}{{.Name}}\t{{.URI}}\t{{.Identity}}\t{{.TLSCAFile}}\t{{.TLSCertFile}}\t{{.TLSKeyFile}}\t{{.Default}}\t{{.ReadWrite}}\n{{end -}}") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. IMO this is a breaking change. While nobody should relay on the order of the output and use --format if they use it in scripts we can never know. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would agree, and while I'm not sure if podman or the the umbrella containers project has strict guidelines on the topic, I've always considered "human readable" data to be excluded from breaking changes. I would no sooner worry about breaking scripts that scrape this output than scripts that break if a new log message was added. |
||
} | ||
if err != nil { | ||
return err | ||
} | ||
|
||
if rpt.RenderHeaders { | ||
err = rpt.Execute([]map[string]string{{ | ||
"Default": "Default", | ||
"Identity": "Identity", | ||
"Name": "Name", | ||
"URI": "URI", | ||
"ReadWrite": "ReadWrite", | ||
"Default": "Default", | ||
"Identity": "Identity", | ||
"TLSCAFile": "TLSCAFile", | ||
"TLSCertFile": "TLSCertFile", | ||
"TLSKeyFile": "TLSKeyFile", | ||
"Name": "Name", | ||
"URI": "URI", | ||
"ReadWrite": "ReadWrite", | ||
}}) | ||
if err != nil { | ||
return err | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not acceptable to me, it is certainly great to force coverage. But we run this many times on each Pr. A 4x time increase is not acceptable.
What we can consider is some split testing, we run the test on fedora rawhide, 41, 40 and debian sid so technically would could wire this up in CI ro run each case on a different distro to not add any new overhead will still getting full coverage. The transport layer should certainly not care about the distro (except underlying kernel bugs of course) so I think that may be best option.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree, this was a "nuclear option" in order to get tests to run with the least amount of change to the tests themselves, and to make sure that I wasn't missing anything.
One thought I had in the interim was that ginkgo allows tagging tests and sets of tests, and selecting a subset of them on the command line. Using this, it would be possible to run a full remote tests via unix sockets, and then a subset of all tests against tcp, tls, and mtls. It would then also be possible to add a separate target to run all tests in all remotes, but wouldn't be run in CI, only on-demand in development environments.
The main thing I would need for this is guidance from the podman core team on which tests they believed were critical to be tested over every possible remote, and which are "good enough" to only be tested over unix. For example, the attach endpoints would definitely need to be tested on all different remotes, as that's how I discovered the additional fixes I had to make.