@@ -9,10 +9,12 @@ import (
99
1010func Test_portMappingsToPestoArgs (t * testing.T ) {
1111 tests := []struct {
12- name string
13- ports []types.PortMapping
14- want []string
15- wantErr string
12+ name string
13+ ports []types.PortMapping
14+ containerIPv4 string
15+ containerIPv6 string
16+ want []string
17+ wantErr string
1618 }{
1719 {
1820 name : "no ports returns nil" ,
@@ -29,79 +31,98 @@ func Test_portMappingsToPestoArgs(t *testing.T) {
2931 ports : []types.PortMapping {
3032 {HostPort : 8080 , ContainerPort : 80 , Protocol : "tcp" , Range : 1 },
3133 },
32- want : []string {"-t" , "0.0.0.0/8080" , "-t" , "[::]/8080" },
34+ containerIPv4 : "10.0.0.2" ,
35+ containerIPv6 : "fd00::2" ,
36+ want : []string {"-t" , "0.0.0.0/8080:10.0.0.2/80" , "-t" , "[::]/8080:fd00::2/80" },
3337 },
3438 {
3539 name : "single udp port dual-stack" ,
3640 ports : []types.PortMapping {
3741 {HostPort : 53 , ContainerPort : 53 , Protocol : "udp" , Range : 1 },
3842 },
39- want : []string {"-u" , "0.0.0.0/53" , "-u" , "[::]/53" },
43+ containerIPv4 : "10.0.0.2" ,
44+ containerIPv6 : "fd00::2" ,
45+ want : []string {"-u" , "0.0.0.0/53:10.0.0.2/53" , "-u" , "[::]/53:fd00::2/53" },
4046 },
4147 {
4248 name : "tcp and udp port dual-stack" ,
4349 ports : []types.PortMapping {
4450 {HostPort : 80 , ContainerPort : 80 , Protocol : "tcp" , Range : 1 },
4551 {HostPort : 53 , ContainerPort : 53 , Protocol : "udp" , Range : 1 },
4652 },
47- want : []string {"-t" , "0.0.0.0/80" , "-t" , "[::]/80" , "-u" , "0.0.0.0/53" , "-u" , "[::]/53" },
53+ containerIPv4 : "10.0.0.2" ,
54+ containerIPv6 : "fd00::2" ,
55+ want : []string {"-t" , "0.0.0.0/80:10.0.0.2/80" , "-t" , "[::]/80:fd00::2/80" , "-u" , "0.0.0.0/53:10.0.0.2/53" , "-u" , "[::]/53:fd00::2/53" },
4856 },
4957 {
5058 name : "dual protocol on single mapping" ,
5159 ports : []types.PortMapping {
5260 {HostPort : 80 , ContainerPort : 80 , Protocol : "tcp,udp" , Range : 1 },
5361 },
54- want : []string {"-t" , "0.0.0.0/80" , "-t" , "[::]/80" , "-u" , "0.0.0.0/80" , "-u" , "[::]/80" },
62+ containerIPv4 : "10.0.0.2" ,
63+ containerIPv6 : "fd00::2" ,
64+ want : []string {"-t" , "0.0.0.0/80:10.0.0.2/80" , "-t" , "[::]/80:fd00::2/80" , "-u" , "0.0.0.0/80:10.0.0.2/80" , "-u" , "[::]/80:fd00::2/80" },
5565 },
5666 {
57- name : "port range expands to host port range " ,
67+ name : "port range maps both host and container ranges " ,
5868 ports : []types.PortMapping {
5969 {HostPort : 8000 , ContainerPort : 80 , Protocol : "tcp" , Range : 5 },
6070 },
61- want : []string {"-t" , "0.0.0.0/8000-8004" , "-t" , "[::]/8000-8004" },
71+ containerIPv4 : "10.0.0.2" ,
72+ containerIPv6 : "fd00::2" ,
73+ want : []string {"-t" , "0.0.0.0/8000-8004:10.0.0.2/80-84" , "-t" , "[::]/8000-8004:fd00::2/80-84" },
6274 },
6375 {
6476 name : "range of zero treated as single port" ,
6577 ports : []types.PortMapping {
6678 {HostPort : 80 , ContainerPort : 80 , Protocol : "tcp" , Range : 0 },
6779 },
68- want : []string {"-t" , "0.0.0.0/80" , "-t" , "[::]/80" },
80+ containerIPv4 : "10.0.0.2" ,
81+ containerIPv6 : "fd00::2" ,
82+ want : []string {"-t" , "0.0.0.0/80:10.0.0.2/80" , "-t" , "[::]/80:fd00::2/80" },
6983 },
7084 {
7185 name : "range of two" ,
7286 ports : []types.PortMapping {
7387 {HostPort : 3000 , ContainerPort : 3000 , Protocol : "tcp" , Range : 2 },
7488 },
75- want : []string {"-t" , "0.0.0.0/3000-3001" , "-t" , "[::]/3000-3001" },
89+ containerIPv4 : "10.0.0.2" ,
90+ containerIPv6 : "fd00::2" ,
91+ want : []string {"-t" , "0.0.0.0/3000-3001:10.0.0.2/3000-3001" , "-t" , "[::]/3000-3001:fd00::2/3000-3001" },
7692 },
7793 {
7894 name : "explicit IPv4 host IP" ,
7995 ports : []types.PortMapping {
8096 {HostIP : "127.0.0.1" , HostPort : 443 , ContainerPort : 443 , Protocol : "tcp" , Range : 1 },
8197 },
82- want : []string {"-t" , "127.0.0.1/443" },
98+ containerIPv4 : "10.0.0.2" ,
99+ want : []string {"-t" , "127.0.0.1/443:10.0.0.2/443" },
83100 },
84101 {
85102 name : "IPv6 host IP gets brackets" ,
86103 ports : []types.PortMapping {
87104 {HostIP : "::1" , HostPort : 8080 , ContainerPort : 80 , Protocol : "tcp" , Range : 1 },
88105 },
89- want : []string {"-t" , "[::1]/8080" },
106+ containerIPv6 : "fd00::2" ,
107+ want : []string {"-t" , "[::1]/8080:fd00::2/80" },
90108 },
91109 {
92110 name : "full-form IPv6 host IP" ,
93111 ports : []types.PortMapping {
94112 {HostIP : "fd00::1" , HostPort : 80 , ContainerPort : 80 , Protocol : "udp" , Range : 1 },
95113 },
96- want : []string {"-u" , "[fd00::1]/80" },
114+ containerIPv6 : "fd00::2" ,
115+ want : []string {"-u" , "[fd00::1]/80:fd00::2/80" },
97116 },
98117 {
99118 name : "multiple tcp ports dual-stack" ,
100119 ports : []types.PortMapping {
101120 {HostPort : 80 , ContainerPort : 80 , Protocol : "tcp" , Range : 1 },
102121 {HostPort : 443 , ContainerPort : 443 , Protocol : "tcp" , Range : 1 },
103122 },
104- want : []string {"-t" , "0.0.0.0/80" , "-t" , "[::]/80" , "-t" , "0.0.0.0/443" , "-t" , "[::]/443" },
123+ containerIPv4 : "10.0.0.2" ,
124+ containerIPv6 : "fd00::2" ,
125+ want : []string {"-t" , "0.0.0.0/80:10.0.0.2/80" , "-t" , "[::]/80:fd00::2/80" , "-t" , "0.0.0.0/443:10.0.0.2/443" , "-t" , "[::]/443:fd00::2/443" },
105126 },
106127 {
107128 name : "unsupported protocol returns error" ,
@@ -123,43 +144,52 @@ func Test_portMappingsToPestoArgs(t *testing.T) {
123144 ports : []types.PortMapping {
124145 {HostIP : "10.0.0.1" , HostPort : 3000 , ContainerPort : 3000 , Protocol : "udp" , Range : 1 },
125146 },
126- want : []string {"-u" , "10.0.0.1/3000" },
147+ containerIPv4 : "10.0.0.2" ,
148+ want : []string {"-u" , "10.0.0.1/3000:10.0.0.2/3000" },
127149 },
128150 {
129- name : "container port does not appear in args " ,
151+ name : "host and container ports differ " ,
130152 ports : []types.PortMapping {
131153 {HostPort : 9090 , ContainerPort : 3000 , Protocol : "tcp" , Range : 1 },
132154 },
133- want : []string {"-t" , "0.0.0.0/9090" , "-t" , "[::]/9090" },
155+ containerIPv4 : "10.0.0.2" ,
156+ containerIPv6 : "fd00::2" ,
157+ want : []string {"-t" , "0.0.0.0/9090:10.0.0.2/3000" , "-t" , "[::]/9090:fd00::2/3000" },
134158 },
135159 {
136160 name : "host IP with range" ,
137161 ports : []types.PortMapping {
138162 {HostIP : "10.0.0.1" , HostPort : 3000 , ContainerPort : 3000 , Protocol : "udp" , Range : 3 },
139163 },
140- want : []string {"-u" , "10.0.0.1/3000-3002" },
164+ containerIPv4 : "10.0.0.2" ,
165+ want : []string {"-u" , "10.0.0.1/3000-3002:10.0.0.2/3000-3002" },
141166 },
142167 {
143168 name : "range with dual protocol" ,
144169 ports : []types.PortMapping {
145170 {HostPort : 5000 , ContainerPort : 5000 , Protocol : "tcp,udp" , Range : 3 },
146171 },
147- want : []string {"-t" , "0.0.0.0/5000-5002" , "-t" , "[::]/5000-5002" , "-u" , "0.0.0.0/5000-5002" , "-u" , "[::]/5000-5002" },
172+ containerIPv4 : "10.0.0.2" ,
173+ containerIPv6 : "fd00::2" ,
174+ want : []string {"-t" , "0.0.0.0/5000-5002:10.0.0.2/5000-5002" , "-t" , "[::]/5000-5002:fd00::2/5000-5002" , "-u" , "0.0.0.0/5000-5002:10.0.0.2/5000-5002" , "-u" , "[::]/5000-5002:fd00::2/5000-5002" },
148175 },
149176 {
150177 name : "IPv6 host IP with range" ,
151178 ports : []types.PortMapping {
152179 {HostIP : "::1" , HostPort : 5000 , ContainerPort : 5000 , Protocol : "tcp" , Range : 4 },
153180 },
154- want : []string {"-t" , "[::1]/5000-5003" },
181+ containerIPv6 : "fd00::2" ,
182+ want : []string {"-t" , "[::1]/5000-5003:fd00::2/5000-5003" },
155183 },
156184 {
157185 name : "mixed explicit and default host IPs" ,
158186 ports : []types.PortMapping {
159187 {HostIP : "10.0.0.1" , HostPort : 80 , ContainerPort : 80 , Protocol : "tcp" , Range : 1 },
160188 {HostPort : 443 , ContainerPort : 443 , Protocol : "tcp" , Range : 1 },
161189 },
162- want : []string {"-t" , "10.0.0.1/80" , "-t" , "0.0.0.0/443" , "-t" , "[::]/443" },
190+ containerIPv4 : "10.0.0.2" ,
191+ containerIPv6 : "fd00::2" ,
192+ want : []string {"-t" , "10.0.0.1/80:10.0.0.2/80" , "-t" , "0.0.0.0/443:10.0.0.2/443" , "-t" , "[::]/443:fd00::2/443" },
163193 },
164194 {
165195 name : "triple protocol with unsupported in middle returns error" ,
@@ -173,14 +203,16 @@ func Test_portMappingsToPestoArgs(t *testing.T) {
173203 ports : []types.PortMapping {
174204 {HostIP : "192.168.1.1" , HostPort : 80 , ContainerPort : 80 , Protocol : "tcp,udp" , Range : 1 },
175205 },
176- want : []string {"-t" , "192.168.1.1/80" , "-u" , "192.168.1.1/80" },
206+ containerIPv4 : "10.0.0.2" ,
207+ want : []string {"-t" , "192.168.1.1/80:10.0.0.2/80" , "-u" , "192.168.1.1/80:10.0.0.2/80" },
177208 },
178209 {
179210 name : "dual protocol with explicit IPv6" ,
180211 ports : []types.PortMapping {
181212 {HostIP : "fd00::1" , HostPort : 80 , ContainerPort : 80 , Protocol : "tcp,udp" , Range : 1 },
182213 },
183- want : []string {"-t" , "[fd00::1]/80" , "-u" , "[fd00::1]/80" },
214+ containerIPv6 : "fd00::2" ,
215+ want : []string {"-t" , "[fd00::1]/80:fd00::2/80" , "-u" , "[fd00::1]/80:fd00::2/80" },
184216 },
185217 {
186218 name : "all unsupported protocols returns error" ,
@@ -189,11 +221,44 @@ func Test_portMappingsToPestoArgs(t *testing.T) {
189221 },
190222 wantErr : "pesto: unsupported protocol sctp" ,
191223 },
224+ {
225+ name : "IPv4 only when no IPv6 container address" ,
226+ ports : []types.PortMapping {
227+ {HostPort : 8080 , ContainerPort : 80 , Protocol : "tcp" , Range : 1 },
228+ },
229+ containerIPv4 : "10.0.0.2" ,
230+ want : []string {"-t" , "0.0.0.0/8080:10.0.0.2/80" },
231+ },
232+ {
233+ name : "IPv6 host IP skipped when no container IPv6" ,
234+ ports : []types.PortMapping {
235+ {HostIP : "::1" , HostPort : 9999 , ContainerPort : 9999 , Protocol : "tcp" , Range : 1 },
236+ },
237+ containerIPv4 : "10.0.0.2" ,
238+ want : nil ,
239+ },
240+ {
241+ name : "IPv4 host IP skipped when no container IPv4" ,
242+ ports : []types.PortMapping {
243+ {HostIP : "127.0.0.1" , HostPort : 9999 , ContainerPort : 9999 , Protocol : "tcp" , Range : 1 },
244+ },
245+ containerIPv6 : "fd00::2" ,
246+ want : nil ,
247+ },
248+ {
249+ name : "different host and container port ranges" ,
250+ ports : []types.PortMapping {
251+ {HostPort : 9000 , ContainerPort : 3000 , Protocol : "tcp" , Range : 3 },
252+ },
253+ containerIPv4 : "10.0.0.2" ,
254+ containerIPv6 : "fd00::2" ,
255+ want : []string {"-t" , "0.0.0.0/9000-9002:10.0.0.2/3000-3002" , "-t" , "[::]/9000-9002:fd00::2/3000-3002" },
256+ },
192257 }
193258
194259 for _ , tt := range tests {
195260 t .Run (tt .name , func (t * testing.T ) {
196- got , err := portMappingsToPestoArgs (tt .ports )
261+ got , err := portMappingsToPestoArgs (tt .ports , tt . containerIPv4 , tt . containerIPv6 )
197262 if tt .wantErr != "" {
198263 assert .EqualError (t , err , tt .wantErr )
199264 return
0 commit comments