github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/specgen/namespaces_test.go (about) 1 package specgen 2 3 import ( 4 "net" 5 "testing" 6 7 "github.com/containers/common/libnetwork/types" 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func parsMacNoErr(mac string) types.HardwareAddr { 12 m, _ := net.ParseMAC(mac) 13 return types.HardwareAddr(m) 14 } 15 16 func TestParseNetworkFlag(t *testing.T) { 17 // root and rootless have different defaults 18 defaultNetName := "default" 19 20 tests := []struct { 21 name string 22 args []string 23 nsmode Namespace 24 networks map[string]types.PerNetworkOptions 25 options map[string][]string 26 err string 27 }{ 28 { 29 name: "empty input", 30 args: nil, 31 nsmode: Namespace{NSMode: Private}, 32 networks: map[string]types.PerNetworkOptions{}, 33 }, 34 { 35 name: "empty string as input", 36 args: []string{}, 37 nsmode: Namespace{NSMode: Private}, 38 networks: map[string]types.PerNetworkOptions{}, 39 }, 40 { 41 name: "default mode", 42 args: []string{"default"}, 43 nsmode: Namespace{NSMode: Private}, 44 networks: map[string]types.PerNetworkOptions{}, 45 }, 46 { 47 name: "private mode", 48 args: []string{"private"}, 49 nsmode: Namespace{NSMode: Private}, 50 networks: map[string]types.PerNetworkOptions{}, 51 }, 52 { 53 name: "bridge mode", 54 args: []string{"bridge"}, 55 nsmode: Namespace{NSMode: Bridge}, 56 networks: map[string]types.PerNetworkOptions{ 57 defaultNetName: {}, 58 }, 59 }, 60 { 61 name: "slirp4netns mode", 62 args: []string{"slirp4netns"}, 63 nsmode: Namespace{NSMode: Slirp}, 64 networks: map[string]types.PerNetworkOptions{}, 65 }, 66 { 67 name: "from pod mode", 68 args: []string{"pod"}, 69 nsmode: Namespace{NSMode: FromPod}, 70 networks: map[string]types.PerNetworkOptions{}, 71 }, 72 { 73 name: "no network mode", 74 args: []string{"none"}, 75 nsmode: Namespace{NSMode: NoNetwork}, 76 networks: map[string]types.PerNetworkOptions{}, 77 }, 78 { 79 name: "container mode", 80 args: []string{"container:abc"}, 81 nsmode: Namespace{NSMode: FromContainer, Value: "abc"}, 82 networks: map[string]types.PerNetworkOptions{}, 83 }, 84 { 85 name: "ns path mode", 86 args: []string{"ns:/path"}, 87 nsmode: Namespace{NSMode: Path, Value: "/path"}, 88 networks: map[string]types.PerNetworkOptions{}, 89 }, 90 { 91 name: "slirp4netns mode with options", 92 args: []string{"slirp4netns:cidr=10.0.0.0/24"}, 93 nsmode: Namespace{NSMode: Slirp}, 94 networks: map[string]types.PerNetworkOptions{}, 95 options: map[string][]string{ 96 "slirp4netns": {"cidr=10.0.0.0/24"}, 97 }, 98 }, 99 { 100 name: "bridge mode with options 1", 101 args: []string{"bridge:ip=10.0.0.1,mac=11:22:33:44:55:66"}, 102 nsmode: Namespace{NSMode: Bridge}, 103 networks: map[string]types.PerNetworkOptions{ 104 defaultNetName: { 105 StaticIPs: []net.IP{net.ParseIP("10.0.0.1")}, 106 StaticMAC: parsMacNoErr("11:22:33:44:55:66"), 107 }, 108 }, 109 }, 110 { 111 name: "bridge mode with options 2", 112 args: []string{"bridge:ip=10.0.0.1,ip=10.0.0.5"}, 113 nsmode: Namespace{NSMode: Bridge}, 114 networks: map[string]types.PerNetworkOptions{ 115 defaultNetName: { 116 StaticIPs: []net.IP{net.ParseIP("10.0.0.1"), net.ParseIP("10.0.0.5")}, 117 }, 118 }, 119 }, 120 { 121 name: "bridge mode with ip6 option", 122 args: []string{"bridge:ip6=fd10::"}, 123 nsmode: Namespace{NSMode: Bridge}, 124 networks: map[string]types.PerNetworkOptions{ 125 defaultNetName: { 126 StaticIPs: []net.IP{net.ParseIP("fd10::")}, 127 }, 128 }, 129 }, 130 { 131 name: "bridge mode with alias option", 132 args: []string{"bridge:alias=myname,alias=myname2"}, 133 nsmode: Namespace{NSMode: Bridge}, 134 networks: map[string]types.PerNetworkOptions{ 135 defaultNetName: { 136 Aliases: []string{"myname", "myname2"}, 137 }, 138 }, 139 }, 140 { 141 name: "bridge mode with alias option", 142 args: []string{"bridge:alias=myname,alias=myname2"}, 143 nsmode: Namespace{NSMode: Bridge}, 144 networks: map[string]types.PerNetworkOptions{ 145 defaultNetName: { 146 Aliases: []string{"myname", "myname2"}, 147 }, 148 }, 149 }, 150 { 151 name: "bridge mode with interface option", 152 args: []string{"bridge:interface_name=eth123"}, 153 nsmode: Namespace{NSMode: Bridge}, 154 networks: map[string]types.PerNetworkOptions{ 155 defaultNetName: { 156 InterfaceName: "eth123", 157 }, 158 }, 159 }, 160 { 161 name: "bridge mode with invalid option", 162 args: []string{"bridge:abc=123"}, 163 nsmode: Namespace{NSMode: Bridge}, 164 err: "unknown bridge network option: abc", 165 }, 166 { 167 name: "bridge mode with invalid ip", 168 args: []string{"bridge:ip=10..1"}, 169 nsmode: Namespace{NSMode: Bridge}, 170 err: "invalid ip address \"10..1\"", 171 }, 172 { 173 name: "bridge mode with invalid mac", 174 args: []string{"bridge:mac=123"}, 175 nsmode: Namespace{NSMode: Bridge}, 176 err: "address 123: invalid MAC address", 177 }, 178 { 179 name: "network name", 180 args: []string{"someName"}, 181 nsmode: Namespace{NSMode: Bridge}, 182 networks: map[string]types.PerNetworkOptions{ 183 "someName": {}, 184 }, 185 }, 186 { 187 name: "network name with options", 188 args: []string{"someName:ip=10.0.0.1"}, 189 nsmode: Namespace{NSMode: Bridge}, 190 networks: map[string]types.PerNetworkOptions{ 191 "someName": {StaticIPs: []net.IP{net.ParseIP("10.0.0.1")}}, 192 }, 193 }, 194 { 195 name: "multiple networks", 196 args: []string{"someName", "net2"}, 197 nsmode: Namespace{NSMode: Bridge}, 198 networks: map[string]types.PerNetworkOptions{ 199 "someName": {}, 200 "net2": {}, 201 }, 202 }, 203 { 204 name: "multiple networks with options", 205 args: []string{"someName:ip=10.0.0.1", "net2:ip=10.10.0.1"}, 206 nsmode: Namespace{NSMode: Bridge}, 207 networks: map[string]types.PerNetworkOptions{ 208 "someName": {StaticIPs: []net.IP{net.ParseIP("10.0.0.1")}}, 209 "net2": {StaticIPs: []net.IP{net.ParseIP("10.10.0.1")}}, 210 }, 211 }, 212 { 213 name: "multiple networks with bridge mode first should map to default net", 214 args: []string{"bridge", "net2"}, 215 nsmode: Namespace{NSMode: Bridge}, 216 networks: map[string]types.PerNetworkOptions{ 217 defaultNetName: {}, 218 "net2": {}, 219 }, 220 }, 221 { 222 name: "conflicting network modes should error", 223 args: []string{"bridge", "host"}, 224 nsmode: Namespace{NSMode: Bridge}, 225 err: "can only set extra network names, selected mode host conflicts with bridge: invalid argument", 226 }, 227 { 228 name: "multiple networks empty name should error", 229 args: []string{"someName", ""}, 230 nsmode: Namespace{NSMode: Bridge}, 231 err: "network name cannot be empty: invalid argument", 232 }, 233 { 234 name: "multiple networks on invalid mode should error", 235 args: []string{"host", "net2"}, 236 nsmode: Namespace{NSMode: Host}, 237 err: "cannot set multiple networks without bridge network mode, selected mode host: invalid argument", 238 }, 239 } 240 241 for _, tt := range tests { 242 tt := tt 243 t.Run(tt.name, func(t *testing.T) { 244 got, got1, got2, err := ParseNetworkFlag(tt.args) 245 if tt.err != "" { 246 assert.EqualError(t, err, tt.err, tt.name) 247 } else { 248 assert.NoError(t, err, tt.name) 249 } 250 251 assert.Equal(t, tt.nsmode, got, tt.name) 252 assert.Equal(t, tt.networks, got1, tt.name) 253 assert.Equal(t, tt.options, got2, tt.name) 254 }) 255 } 256 }