mirror of
https://github.com/containers/podman.git
synced 2025-05-29 06:03:25 +08:00

The pasta network mode has been added in podman v4.4 and this causes a conflict with named networks that could also be called "pasta". To not break anything we had special logic to prefer the named network over the network mode. Now with 5.0 we can break this and remove this awkward special handling from the code. Containers created with 4.X that use a named network pasta will also continue to work fine, this chnage will only effect the creation of new containers with a named network pasta and instead always used the network mode pasta. We now also block the creation of networks with the name "pasta". Signed-off-by: Paul Holzinger <pholzing@redhat.com>
257 lines
7.0 KiB
Go
257 lines
7.0 KiB
Go
package specgen
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
|
|
"github.com/containers/common/libnetwork/types"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func parsMacNoErr(mac string) types.HardwareAddr {
|
|
m, _ := net.ParseMAC(mac)
|
|
return types.HardwareAddr(m)
|
|
}
|
|
|
|
func TestParseNetworkFlag(t *testing.T) {
|
|
// root and rootless have different defaults
|
|
defaultNetName := "default"
|
|
|
|
tests := []struct {
|
|
name string
|
|
args []string
|
|
nsmode Namespace
|
|
networks map[string]types.PerNetworkOptions
|
|
options map[string][]string
|
|
err string
|
|
}{
|
|
{
|
|
name: "empty input",
|
|
args: nil,
|
|
nsmode: Namespace{NSMode: Private},
|
|
networks: map[string]types.PerNetworkOptions{},
|
|
},
|
|
{
|
|
name: "empty string as input",
|
|
args: []string{},
|
|
nsmode: Namespace{NSMode: Private},
|
|
networks: map[string]types.PerNetworkOptions{},
|
|
},
|
|
{
|
|
name: "default mode",
|
|
args: []string{"default"},
|
|
nsmode: Namespace{NSMode: Private},
|
|
networks: map[string]types.PerNetworkOptions{},
|
|
},
|
|
{
|
|
name: "private mode",
|
|
args: []string{"private"},
|
|
nsmode: Namespace{NSMode: Private},
|
|
networks: map[string]types.PerNetworkOptions{},
|
|
},
|
|
{
|
|
name: "bridge mode",
|
|
args: []string{"bridge"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
defaultNetName: {},
|
|
},
|
|
},
|
|
{
|
|
name: "slirp4netns mode",
|
|
args: []string{"slirp4netns"},
|
|
nsmode: Namespace{NSMode: Slirp},
|
|
networks: map[string]types.PerNetworkOptions{},
|
|
},
|
|
{
|
|
name: "from pod mode",
|
|
args: []string{"pod"},
|
|
nsmode: Namespace{NSMode: FromPod},
|
|
networks: map[string]types.PerNetworkOptions{},
|
|
},
|
|
{
|
|
name: "no network mode",
|
|
args: []string{"none"},
|
|
nsmode: Namespace{NSMode: NoNetwork},
|
|
networks: map[string]types.PerNetworkOptions{},
|
|
},
|
|
{
|
|
name: "container mode",
|
|
args: []string{"container:abc"},
|
|
nsmode: Namespace{NSMode: FromContainer, Value: "abc"},
|
|
networks: map[string]types.PerNetworkOptions{},
|
|
},
|
|
{
|
|
name: "ns path mode",
|
|
args: []string{"ns:/path"},
|
|
nsmode: Namespace{NSMode: Path, Value: "/path"},
|
|
networks: map[string]types.PerNetworkOptions{},
|
|
},
|
|
{
|
|
name: "slirp4netns mode with options",
|
|
args: []string{"slirp4netns:cidr=10.0.0.0/24"},
|
|
nsmode: Namespace{NSMode: Slirp},
|
|
networks: map[string]types.PerNetworkOptions{},
|
|
options: map[string][]string{
|
|
"slirp4netns": {"cidr=10.0.0.0/24"},
|
|
},
|
|
},
|
|
{
|
|
name: "bridge mode with options 1",
|
|
args: []string{"bridge:ip=10.0.0.1,mac=11:22:33:44:55:66"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
defaultNetName: {
|
|
StaticIPs: []net.IP{net.ParseIP("10.0.0.1")},
|
|
StaticMAC: parsMacNoErr("11:22:33:44:55:66"),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "bridge mode with options 2",
|
|
args: []string{"bridge:ip=10.0.0.1,ip=10.0.0.5"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
defaultNetName: {
|
|
StaticIPs: []net.IP{net.ParseIP("10.0.0.1"), net.ParseIP("10.0.0.5")},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "bridge mode with ip6 option",
|
|
args: []string{"bridge:ip6=fd10::"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
defaultNetName: {
|
|
StaticIPs: []net.IP{net.ParseIP("fd10::")},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "bridge mode with alias option",
|
|
args: []string{"bridge:alias=myname,alias=myname2"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
defaultNetName: {
|
|
Aliases: []string{"myname", "myname2"},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "bridge mode with alias option",
|
|
args: []string{"bridge:alias=myname,alias=myname2"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
defaultNetName: {
|
|
Aliases: []string{"myname", "myname2"},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "bridge mode with interface option",
|
|
args: []string{"bridge:interface_name=eth123"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
defaultNetName: {
|
|
InterfaceName: "eth123",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "bridge mode with invalid option",
|
|
args: []string{"bridge:abc=123"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
err: "unknown bridge network option: abc",
|
|
},
|
|
{
|
|
name: "bridge mode with invalid ip",
|
|
args: []string{"bridge:ip=10..1"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
err: "invalid ip address \"10..1\"",
|
|
},
|
|
{
|
|
name: "bridge mode with invalid mac",
|
|
args: []string{"bridge:mac=123"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
err: "address 123: invalid MAC address",
|
|
},
|
|
{
|
|
name: "network name",
|
|
args: []string{"someName"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
"someName": {},
|
|
},
|
|
},
|
|
{
|
|
name: "network name with options",
|
|
args: []string{"someName:ip=10.0.0.1"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
"someName": {StaticIPs: []net.IP{net.ParseIP("10.0.0.1")}},
|
|
},
|
|
},
|
|
{
|
|
name: "multiple networks",
|
|
args: []string{"someName", "net2"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
"someName": {},
|
|
"net2": {},
|
|
},
|
|
},
|
|
{
|
|
name: "multiple networks with options",
|
|
args: []string{"someName:ip=10.0.0.1", "net2:ip=10.10.0.1"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
"someName": {StaticIPs: []net.IP{net.ParseIP("10.0.0.1")}},
|
|
"net2": {StaticIPs: []net.IP{net.ParseIP("10.10.0.1")}},
|
|
},
|
|
},
|
|
{
|
|
name: "multiple networks with bridge mode first should map to default net",
|
|
args: []string{"bridge", "net2"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
networks: map[string]types.PerNetworkOptions{
|
|
defaultNetName: {},
|
|
"net2": {},
|
|
},
|
|
},
|
|
{
|
|
name: "conflicting network modes should error",
|
|
args: []string{"bridge", "host"},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
err: "can only set extra network names, selected mode host conflicts with bridge: invalid argument",
|
|
},
|
|
{
|
|
name: "multiple networks empty name should error",
|
|
args: []string{"someName", ""},
|
|
nsmode: Namespace{NSMode: Bridge},
|
|
err: "network name cannot be empty: invalid argument",
|
|
},
|
|
{
|
|
name: "multiple networks on invalid mode should error",
|
|
args: []string{"host", "net2"},
|
|
nsmode: Namespace{NSMode: Host},
|
|
err: "cannot set multiple networks without bridge network mode, selected mode host: invalid argument",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
tt := tt
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, got1, got2, err := ParseNetworkFlag(tt.args)
|
|
if tt.err != "" {
|
|
assert.EqualError(t, err, tt.err, tt.name)
|
|
} else {
|
|
assert.NoError(t, err, tt.name)
|
|
}
|
|
|
|
assert.Equal(t, tt.nsmode, got, tt.name)
|
|
assert.Equal(t, tt.networks, got1, tt.name)
|
|
assert.Equal(t, tt.options, got2, tt.name)
|
|
})
|
|
}
|
|
}
|