aboutsummaryrefslogtreecommitdiff
path: root/libpod/network/create_test.go
blob: c3824bd91506d29a9bacfa9d10b75ab3cd4727d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package network

import (
	"net"
	"testing"

	"github.com/containers/podman/v3/pkg/domain/entities"
)

func Test_validateBridgeOptions(t *testing.T) {
	tests := []struct {
		name    string
		subnet  net.IPNet
		ipRange net.IPNet
		gateway net.IP
		isIPv6  bool
		wantErr bool
	}{
		{
			name:   "IPv4 subnet only",
			subnet: net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
		},
		{
			name:    "IPv4 subnet and range",
			subnet:  net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
			ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)},
		},
		{
			name:    "IPv4 subnet and gateway",
			subnet:  net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
			gateway: net.ParseIP("192.168.0.10"),
		},
		{
			name:    "IPv4 subnet, range and gateway",
			subnet:  net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
			ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)},
			gateway: net.ParseIP("192.168.0.10"),
		},
		{
			name:   "IPv6 subnet only",
			subnet: net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
		},
		{
			name:    "IPv6 subnet and range",
			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
			ipRange: net.IPNet{IP: net.ParseIP("2001:DB8:0:0:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))},
			isIPv6:  true,
		},
		{
			name:    "IPv6 subnet and gateway",
			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
			gateway: net.ParseIP("2001:DB8::2"),
			isIPv6:  true,
		},
		{
			name:    "IPv6 subnet, range and gateway",
			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
			ipRange: net.IPNet{IP: net.ParseIP("2001:DB8:0:0:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))},
			gateway: net.ParseIP("2001:DB8::2"),
			isIPv6:  true,
		},
		{
			name:    "IPv6 subnet, range and gateway without IPv6 option (PODMAN SUPPORTS IT UNLIKE DOCKER)",
			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
			ipRange: net.IPNet{IP: net.ParseIP("2001:DB8:0:0:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))},
			gateway: net.ParseIP("2001:DB8::2"),
			isIPv6:  false,
		},
		{
			name:    "range provided but not subnet",
			ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)},
			wantErr: true,
		},
		{
			name:    "gateway provided but not subnet",
			gateway: net.ParseIP("192.168.0.10"),
			wantErr: true,
		},
		{
			name:    "IPv4 subnet but IPv6 required",
			subnet:  net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
			ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)},
			gateway: net.ParseIP("192.168.0.10"),
			isIPv6:  true,
			wantErr: true,
		},
		{
			name:    "IPv6 required but IPv4 options used",
			subnet:  net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
			ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)},
			gateway: net.ParseIP("192.168.0.10"),
			isIPv6:  true,
			wantErr: true,
		},
		{
			name:    "IPv6 required but not subnet provided",
			isIPv6:  true,
			wantErr: true,
		},
		{
			name:    "range out of the subnet",
			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
			ipRange: net.IPNet{IP: net.ParseIP("2001:1:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))},
			gateway: net.ParseIP("2001:DB8::2"),
			isIPv6:  true,
			wantErr: true,
		},
		{
			name:    "gateway out of the subnet",
			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
			gateway: net.ParseIP("2001::2"),
			isIPv6:  true,
			wantErr: true,
		},
	}
	for _, tt := range tests {
		tt := tt
		t.Run(tt.name, func(t *testing.T) {
			options := entities.NetworkCreateOptions{
				Subnet:  tt.subnet,
				Range:   tt.ipRange,
				Gateway: tt.gateway,
				IPv6:    tt.isIPv6,
			}
			if err := validateBridgeOptions(options); (err != nil) != tt.wantErr {
				t.Errorf("validateBridgeOptions() error = %v, wantErr %v", err, tt.wantErr)
			}
		})
	}
}