sigs.k8s.io/cluster-api@v1.7.1/api/v1beta1/cluster_types_test.go (about)

     1  /*
     2  Copyright 2021 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package v1beta1
    18  
    19  import (
    20  	"testing"
    21  
    22  	. "github.com/onsi/gomega"
    23  )
    24  
    25  func TestClusterIPFamily(t *testing.T) {
    26  	clusterWithNetwork := func(podCIDRs, serviceCIDRs []string) *Cluster {
    27  		return &Cluster{
    28  			Spec: ClusterSpec{
    29  				ClusterNetwork: &ClusterNetwork{
    30  					Pods: &NetworkRanges{
    31  						CIDRBlocks: podCIDRs,
    32  					},
    33  					Services: &NetworkRanges{
    34  						CIDRBlocks: serviceCIDRs,
    35  					},
    36  				},
    37  			},
    38  		}
    39  	}
    40  
    41  	validAndUnambiguous := []struct {
    42  		name      string
    43  		expectRes ClusterIPFamily
    44  		c         *Cluster
    45  	}{
    46  		{
    47  			name:      "pods: ipv4, services: ipv4",
    48  			expectRes: IPv4IPFamily,
    49  			c:         clusterWithNetwork([]string{"192.168.0.0/16"}, []string{"10.128.0.0/12"}),
    50  		},
    51  		{
    52  			name:      "pods: ipv4, services: nil",
    53  			expectRes: IPv4IPFamily,
    54  			c:         clusterWithNetwork([]string{"192.168.0.0/16"}, nil),
    55  		},
    56  		{
    57  			name:      "pods: ipv6, services: nil",
    58  			expectRes: IPv6IPFamily,
    59  			c:         clusterWithNetwork([]string{"fd00:100:96::/48"}, nil),
    60  		},
    61  		{
    62  			name:      "pods: ipv6, services: ipv6",
    63  			expectRes: IPv6IPFamily,
    64  			c:         clusterWithNetwork([]string{"fd00:100:96::/48"}, []string{"fd00:100:64::/108"}),
    65  		},
    66  		{
    67  			name:      "pods: dual-stack, services: nil",
    68  			expectRes: DualStackIPFamily,
    69  			c:         clusterWithNetwork([]string{"192.168.0.0/16", "fd00:100:96::/48"}, nil),
    70  		},
    71  		{
    72  			name:      "pods: dual-stack, services: ipv4",
    73  			expectRes: DualStackIPFamily,
    74  			c:         clusterWithNetwork([]string{"192.168.0.0/16", "fd00:100:96::/48"}, []string{"10.128.0.0/12"}),
    75  		},
    76  		{
    77  			name:      "pods: dual-stack, services: ipv6",
    78  			expectRes: DualStackIPFamily,
    79  			c:         clusterWithNetwork([]string{"192.168.0.0/16", "fd00:100:96::/48"}, []string{"fd00:100:64::/108"}),
    80  		},
    81  		{
    82  			name:      "pods: dual-stack, services: dual-stack",
    83  			expectRes: DualStackIPFamily,
    84  			c:         clusterWithNetwork([]string{"192.168.0.0/16", "fd00:100:96::/48"}, []string{"10.128.0.0/12", "fd00:100:64::/108"}),
    85  		},
    86  		{
    87  			name:      "pods: nil, services: dual-stack",
    88  			expectRes: DualStackIPFamily,
    89  			c:         clusterWithNetwork(nil, []string{"10.128.0.0/12", "fd00:100:64::/108"}),
    90  		},
    91  	}
    92  
    93  	for _, tt := range validAndUnambiguous {
    94  		t.Run(tt.name, func(t *testing.T) {
    95  			g := NewWithT(t)
    96  			ipFamily, err := tt.c.GetIPFamily()
    97  			g.Expect(ipFamily).To(Equal(tt.expectRes))
    98  			g.Expect(err).ToNot(HaveOccurred())
    99  		})
   100  	}
   101  
   102  	validButAmbiguous := []struct {
   103  		name      string
   104  		expectRes ClusterIPFamily
   105  		c         *Cluster
   106  	}{
   107  		{
   108  			name: "pods: nil, services: nil",
   109  			// this could  be ipv4, ipv6, or dual-stack; assume ipv4 for now though
   110  			expectRes: IPv4IPFamily,
   111  			c:         clusterWithNetwork(nil, nil),
   112  		},
   113  		{
   114  			name: "pods: nil, services: ipv4",
   115  			// this could be a dual-stack; assume ipv4 for now though
   116  			expectRes: IPv4IPFamily,
   117  			c:         clusterWithNetwork(nil, []string{"10.128.0.0/12"}),
   118  		},
   119  		{
   120  			name: "pods: nil, services: ipv6",
   121  			// this could be dual-stack; assume ipv6 for now though
   122  			expectRes: IPv6IPFamily,
   123  			c:         clusterWithNetwork(nil, []string{"fd00:100:64::/108"}),
   124  		},
   125  	}
   126  
   127  	for _, tt := range validButAmbiguous {
   128  		t.Run(tt.name, func(t *testing.T) {
   129  			g := NewWithT(t)
   130  			ipFamily, err := tt.c.GetIPFamily()
   131  			g.Expect(ipFamily).To(Equal(tt.expectRes))
   132  			g.Expect(err).ToNot(HaveOccurred())
   133  		})
   134  	}
   135  
   136  	invalid := []struct {
   137  		name      string
   138  		expectErr string
   139  		c         *Cluster
   140  	}{
   141  		{
   142  			name:      "pods: ipv4, services: ipv6",
   143  			expectErr: "pods and services IP family mismatch",
   144  			c:         clusterWithNetwork([]string{"192.168.0.0/16"}, []string{"fd00:100:64::/108"}),
   145  		},
   146  		{
   147  			name:      "pods: ipv6, services: ipv4",
   148  			expectErr: "pods and services IP family mismatch",
   149  			c:         clusterWithNetwork([]string{"fd00:100:96::/48"}, []string{"10.128.0.0/12"}),
   150  		},
   151  		{
   152  			name:      "pods: ipv6, services: dual-stack",
   153  			expectErr: "pods and services IP family mismatch",
   154  			c:         clusterWithNetwork([]string{"fd00:100:96::/48"}, []string{"10.128.0.0/12", "fd00:100:64::/108"}),
   155  		},
   156  		{
   157  			name:      "pods: ipv4, services: dual-stack",
   158  			expectErr: "pods and services IP family mismatch",
   159  			c:         clusterWithNetwork([]string{"192.168.0.0/16"}, []string{"10.128.0.0/12", "fd00:100:64::/108"}),
   160  		},
   161  		{
   162  			name:      "pods: ipv4, services: dual-stack",
   163  			expectErr: "pods and services IP family mismatch",
   164  			c:         clusterWithNetwork([]string{"192.168.0.0/16"}, []string{"10.128.0.0/12", "fd00:100:64::/108"}),
   165  		},
   166  		{
   167  			name:      "pods: bad cidr",
   168  			expectErr: "pods: could not parse CIDR",
   169  			c:         clusterWithNetwork([]string{"foo"}, nil),
   170  		},
   171  		{
   172  			name:      "services: bad cidr",
   173  			expectErr: "services: could not parse CIDR",
   174  			c:         clusterWithNetwork([]string{"192.168.0.0/16"}, []string{"foo"}),
   175  		},
   176  		{
   177  			name:      "pods: too many cidrs",
   178  			expectErr: "pods: too many CIDRs specified",
   179  			c:         clusterWithNetwork([]string{"192.168.0.0/16", "fd00:100:96::/48", "10.128.0.0/12"}, nil),
   180  		},
   181  		{
   182  			name:      "services: too many cidrs",
   183  			expectErr: "services: too many CIDRs specified",
   184  			c:         clusterWithNetwork(nil, []string{"192.168.0.0/16", "fd00:100:96::/48", "10.128.0.0/12"}),
   185  		},
   186  	}
   187  
   188  	for _, tt := range invalid {
   189  		t.Run(tt.name, func(t *testing.T) {
   190  			g := NewWithT(t)
   191  			ipFamily, err := tt.c.GetIPFamily()
   192  			g.Expect(err).To(HaveOccurred())
   193  			g.Expect(err).To(MatchError(ContainSubstring(tt.expectErr)))
   194  			g.Expect(ipFamily).To(Equal(InvalidIPFamily))
   195  		})
   196  	}
   197  }