mirror of
https://github.com/containers/podman.git
synced 2025-06-10 09:47:25 +08:00

Because we cannot reqad the networking mode in the frontent because we should always use the server default we have to parse the mac and ip address to the server via a default network. Now when the server reads the default nsmode it has to reject the provided networks when the mode is not set to bridge. Signed-off-by: Paul Holzinger <pholzing@redhat.com>
89 lines
2.6 KiB
Go
89 lines
2.6 KiB
Go
package specgen
|
|
|
|
import (
|
|
"github.com/containers/podman/v3/pkg/util"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
var (
|
|
// ErrInvalidPodSpecConfig describes an error given when the podspecgenerator is invalid
|
|
ErrInvalidPodSpecConfig = errors.New("invalid pod spec")
|
|
// containerConfig has the default configurations defined in containers.conf
|
|
containerConfig = util.DefaultContainerConfig()
|
|
)
|
|
|
|
func exclusivePodOptions(opt1, opt2 string) error {
|
|
return errors.Wrapf(ErrInvalidPodSpecConfig, "%s and %s are mutually exclusive pod options", opt1, opt2)
|
|
}
|
|
|
|
// Validate verifies the input is valid
|
|
func (p *PodSpecGenerator) Validate() error {
|
|
// PodBasicConfig
|
|
if p.NoInfra {
|
|
if len(p.InfraCommand) > 0 {
|
|
return exclusivePodOptions("NoInfra", "InfraCommand")
|
|
}
|
|
if len(p.InfraImage) > 0 {
|
|
return exclusivePodOptions("NoInfra", "InfraImage")
|
|
}
|
|
if len(p.InfraName) > 0 {
|
|
return exclusivePodOptions("NoInfra", "InfraName")
|
|
}
|
|
if len(p.SharedNamespaces) > 0 {
|
|
return exclusivePodOptions("NoInfra", "SharedNamespaces")
|
|
}
|
|
}
|
|
|
|
// PodNetworkConfig
|
|
if err := validateNetNS(&p.NetNS); err != nil {
|
|
return err
|
|
}
|
|
if p.NoInfra {
|
|
if p.NetNS.NSMode != Default && p.NetNS.NSMode != "" {
|
|
return errors.New("NoInfra and network modes cannot be used together")
|
|
}
|
|
// Note that networks might be set when --ip or --mac was set
|
|
// so we need to check that no networks are set without the infra
|
|
if len(p.Networks) > 0 {
|
|
return errors.New("cannot set networks options without infra container")
|
|
}
|
|
if len(p.DNSOption) > 0 {
|
|
return exclusivePodOptions("NoInfra", "DNSOption")
|
|
}
|
|
if len(p.DNSSearch) > 0 {
|
|
return exclusivePodOptions("NoInfo", "DNSSearch")
|
|
}
|
|
if len(p.DNSServer) > 0 {
|
|
return exclusivePodOptions("NoInfra", "DNSServer")
|
|
}
|
|
if len(p.HostAdd) > 0 {
|
|
return exclusivePodOptions("NoInfra", "HostAdd")
|
|
}
|
|
if p.NoManageResolvConf {
|
|
return exclusivePodOptions("NoInfra", "NoManageResolvConf")
|
|
}
|
|
}
|
|
if p.NetNS.NSMode != "" && p.NetNS.NSMode != Bridge && p.NetNS.NSMode != Slirp && p.NetNS.NSMode != Default {
|
|
if len(p.PortMappings) > 0 {
|
|
return errors.New("PortMappings can only be used with Bridge or slirp4netns networking")
|
|
}
|
|
}
|
|
|
|
if p.NoManageResolvConf {
|
|
if len(p.DNSServer) > 0 {
|
|
return exclusivePodOptions("NoManageResolvConf", "DNSServer")
|
|
}
|
|
if len(p.DNSSearch) > 0 {
|
|
return exclusivePodOptions("NoManageResolvConf", "DNSSearch")
|
|
}
|
|
if len(p.DNSOption) > 0 {
|
|
return exclusivePodOptions("NoManageResolvConf", "DNSOption")
|
|
}
|
|
}
|
|
if p.NoManageHosts && len(p.HostAdd) > 0 {
|
|
return exclusivePodOptions("NoManageHosts", "HostAdd")
|
|
}
|
|
|
|
return nil
|
|
}
|