github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/libpod/network/create_test.go (about)

     1  package network
     2  
     3  import (
     4  	"net"
     5  	"testing"
     6  
     7  	"github.com/containers/podman/v2/pkg/domain/entities"
     8  )
     9  
    10  func Test_validateBridgeOptions(t *testing.T) {
    11  
    12  	tests := []struct {
    13  		name    string
    14  		subnet  net.IPNet
    15  		ipRange net.IPNet
    16  		gateway net.IP
    17  		isIPv6  bool
    18  		wantErr bool
    19  	}{
    20  		{
    21  			name:   "IPv4 subnet only",
    22  			subnet: net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
    23  		},
    24  		{
    25  			name:    "IPv4 subnet and range",
    26  			subnet:  net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
    27  			ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)},
    28  		},
    29  		{
    30  			name:    "IPv4 subnet and gateway",
    31  			subnet:  net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
    32  			gateway: net.ParseIP("192.168.0.10"),
    33  		},
    34  		{
    35  			name:    "IPv4 subnet, range and gateway",
    36  			subnet:  net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
    37  			ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)},
    38  			gateway: net.ParseIP("192.168.0.10"),
    39  		},
    40  		{
    41  			name:   "IPv6 subnet only",
    42  			subnet: net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
    43  		},
    44  		{
    45  			name:    "IPv6 subnet and range",
    46  			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
    47  			ipRange: net.IPNet{IP: net.ParseIP("2001:DB8:0:0:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))},
    48  			isIPv6:  true,
    49  		},
    50  		{
    51  			name:    "IPv6 subnet and gateway",
    52  			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
    53  			gateway: net.ParseIP("2001:DB8::2"),
    54  			isIPv6:  true,
    55  		},
    56  		{
    57  			name:    "IPv6 subnet, range and gateway",
    58  			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
    59  			ipRange: net.IPNet{IP: net.ParseIP("2001:DB8:0:0:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))},
    60  			gateway: net.ParseIP("2001:DB8::2"),
    61  			isIPv6:  true,
    62  		},
    63  		{
    64  			name:    "IPv6 subnet, range and gateway without IPv6 option (PODMAN SUPPORTS IT UNLIKE DOCKEr)",
    65  			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
    66  			ipRange: net.IPNet{IP: net.ParseIP("2001:DB8:0:0:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))},
    67  			gateway: net.ParseIP("2001:DB8::2"),
    68  			isIPv6:  false,
    69  		},
    70  		{
    71  			name:    "range provided but not subnet",
    72  			ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)},
    73  			wantErr: true,
    74  		},
    75  		{
    76  			name:    "gateway provided but not subnet",
    77  			gateway: net.ParseIP("192.168.0.10"),
    78  			wantErr: true,
    79  		},
    80  		{
    81  			name:    "IPv4 subnet but IPv6 required",
    82  			subnet:  net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
    83  			ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)},
    84  			gateway: net.ParseIP("192.168.0.10"),
    85  			isIPv6:  true,
    86  			wantErr: true,
    87  		},
    88  		{
    89  			name:    "IPv6 required but IPv4 options used",
    90  			subnet:  net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)},
    91  			ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)},
    92  			gateway: net.ParseIP("192.168.0.10"),
    93  			isIPv6:  true,
    94  			wantErr: true,
    95  		},
    96  		{
    97  			name:    "IPv6 required but not subnet provided",
    98  			isIPv6:  true,
    99  			wantErr: true,
   100  		},
   101  		{
   102  			name:    "range out of the subnet",
   103  			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
   104  			ipRange: net.IPNet{IP: net.ParseIP("2001:1:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))},
   105  			gateway: net.ParseIP("2001:DB8::2"),
   106  			isIPv6:  true,
   107  			wantErr: true,
   108  		},
   109  		{
   110  			name:    "gateway out of the subnet",
   111  			subnet:  net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))},
   112  			gateway: net.ParseIP("2001::2"),
   113  			isIPv6:  true,
   114  			wantErr: true,
   115  		},
   116  	}
   117  	for _, tt := range tests {
   118  		tt := tt
   119  		t.Run(tt.name, func(t *testing.T) {
   120  			options := entities.NetworkCreateOptions{
   121  				Subnet:  tt.subnet,
   122  				Range:   tt.ipRange,
   123  				Gateway: tt.gateway,
   124  				IPv6:    tt.isIPv6,
   125  			}
   126  			if err := validateBridgeOptions(options); (err != nil) != tt.wantErr {
   127  				t.Errorf("validateBridgeOptions() error = %v, wantErr %v", err, tt.wantErr)
   128  			}
   129  		})
   130  	}
   131  }