...

Source file src/k8s.io/kubernetes/pkg/proxy/ipvs/ipset_test.go

Documentation: k8s.io/kubernetes/pkg/proxy/ipvs

     1  //go:build linux
     2  // +build linux
     3  
     4  /*
     5  Copyright 2017 The Kubernetes Authors.
     6  
     7  Licensed under the Apache License, Version 2.0 (the "License");
     8  you may not use this file except in compliance with the License.
     9  You may obtain a copy of the License at
    10  
    11      http://www.apache.org/licenses/LICENSE-2.0
    12  
    13  Unless required by applicable law or agreed to in writing, software
    14  distributed under the License is distributed on an "AS IS" BASIS,
    15  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    16  See the License for the specific language governing permissions and
    17  limitations under the License.
    18  */
    19  
    20  package ipvs
    21  
    22  import (
    23  	"testing"
    24  
    25  	utilipset "k8s.io/kubernetes/pkg/proxy/ipvs/ipset"
    26  	fakeipset "k8s.io/kubernetes/pkg/proxy/ipvs/ipset/testing"
    27  )
    28  
    29  func TestCheckIPSetVersion(t *testing.T) {
    30  	testCases := []struct {
    31  		name    string
    32  		vstring string
    33  		valid   bool
    34  	}{
    35  		{"4.0 < 6.0 is invalid", "4.0", false},
    36  		{"5.1 < 6.0 is invalid", "5.1", false},
    37  		{"5.2 < 6.0 is invalid", "5.1.2", false},
    38  		{"7 is not a valid version", "7", false},
    39  		{"6.0 is valid since >= 6.0", "6.0", true},
    40  		{"6.1 is valid since >= 6.0", "6.1", true},
    41  		{"6.19 is valid since >= 6.0", "6.19", true},
    42  		{"7.0 is valid since >= 6.0", "7.0", true},
    43  		{"8.1.2 is valid since >= 6.0", "8.1.2", true},
    44  		{"9.3.4.0 is valid since >= 6.0", "9.3.4.0", true},
    45  		{"not a valid semantic version", "total junk", false},
    46  	}
    47  
    48  	for _, testCase := range testCases {
    49  		t.Run(testCase.name, func(t *testing.T) {
    50  			valid := checkMinVersion(testCase.vstring)
    51  			if testCase.valid != valid {
    52  				t.Errorf("Expected result: %v, Got result: %v", testCase.valid, valid)
    53  			}
    54  		})
    55  	}
    56  }
    57  
    58  const testIPSetVersion = "v6.19"
    59  
    60  func TestSyncIPSetEntries(t *testing.T) {
    61  	testCases := []struct {
    62  		name            string
    63  		set             *utilipset.IPSet
    64  		setType         utilipset.Type
    65  		ipv6            bool
    66  		activeEntries   []string
    67  		currentEntries  []string
    68  		expectedEntries []string
    69  	}{
    70  		{
    71  			name: "normal ipset sync",
    72  			set: &utilipset.IPSet{
    73  				Name: "foo",
    74  			},
    75  			setType:         utilipset.HashIPPort,
    76  			ipv6:            false,
    77  			activeEntries:   []string{"172.17.0.4,tcp:80"},
    78  			currentEntries:  nil,
    79  			expectedEntries: []string{"172.17.0.4,tcp:80"},
    80  		},
    81  		{
    82  			name: "ipset IPv6 sync with no new entries",
    83  			set: &utilipset.IPSet{
    84  				Name: "abz",
    85  			},
    86  			setType:         utilipset.HashIPPort,
    87  			ipv6:            true,
    88  			activeEntries:   []string{"FE80::0202:B3FF:FE1E:8329,tcp:80"},
    89  			currentEntries:  []string{"FE80::0202:B3FF:FE1E:8329,tcp:80"},
    90  			expectedEntries: []string{"FE80::0202:B3FF:FE1E:8329,tcp:80"},
    91  		},
    92  		{
    93  			name: "ipset sync with updated udp->tcp in hash",
    94  			set: &utilipset.IPSet{
    95  				Name: "bca",
    96  			},
    97  			setType:         utilipset.HashIPPort,
    98  			ipv6:            false,
    99  			activeEntries:   []string{"172.17.0.4,tcp:80", "172.17.0.5,tcp:80"},
   100  			currentEntries:  []string{"172.17.0.5,udp:53"},
   101  			expectedEntries: []string{"172.17.0.4,tcp:80", "172.17.0.5,tcp:80"},
   102  		},
   103  		{
   104  			name: "ipset sync no updates required",
   105  			set: &utilipset.IPSet{
   106  				Name: "bar",
   107  			},
   108  			setType:         utilipset.HashIPPortIP,
   109  			ipv6:            false,
   110  			activeEntries:   []string{"172.17.0.4,tcp:80:172.17.0.4"},
   111  			currentEntries:  []string{"172.17.0.4,tcp:80:172.17.0.4"},
   112  			expectedEntries: []string{"172.17.0.4,tcp:80:172.17.0.4"},
   113  		},
   114  		{
   115  			name: "ipset IPv6 sync, delete and add new entry",
   116  			set: &utilipset.IPSet{
   117  				Name: "baz",
   118  			},
   119  			setType:         utilipset.HashIPPortIP,
   120  			ipv6:            true,
   121  			activeEntries:   []string{"FE80:0000:0000:0000:0202:B3FF:FE1E:8329,tcp:8080:FE80:0000:0000:0000:0202:B3FF:FE1E:8329"},
   122  			currentEntries:  []string{"1111:0000:0000:0000:0202:B3FF:FE1E:8329,tcp:8081:1111:0000:0000:0000:0202:B3FF:FE1E:8329:8081"},
   123  			expectedEntries: []string{"FE80:0000:0000:0000:0202:B3FF:FE1E:8329,tcp:8080:FE80:0000:0000:0000:0202:B3FF:FE1E:8329"},
   124  		},
   125  		{
   126  			name: "ipset sync, no current entries",
   127  			set: &utilipset.IPSet{
   128  				Name: "NOPE",
   129  			},
   130  			setType:         utilipset.HashIPPortIP,
   131  			ipv6:            false,
   132  			activeEntries:   []string{"172.17.0.4,tcp:80,172.17.0.9", "172.17.0.5,tcp:80,172.17.0.10"},
   133  			currentEntries:  nil,
   134  			expectedEntries: []string{"172.17.0.4,tcp:80,172.17.0.9", "172.17.0.5,tcp:80,172.17.0.10"},
   135  		},
   136  		{
   137  			name: "ipset sync, no current entries with /16 subnet",
   138  			set: &utilipset.IPSet{
   139  				Name: "ABC-DEF",
   140  			},
   141  			setType:         utilipset.HashIPPortNet,
   142  			ipv6:            false,
   143  			activeEntries:   []string{"172.17.0.4,tcp:80,172.17.0.0/16", "172.17.0.5,tcp:80,172.17.0.0/16"},
   144  			currentEntries:  nil,
   145  			expectedEntries: []string{"172.17.0.4,tcp:80,172.17.0.0/16", "172.17.0.5,tcp:80,172.17.0.0/16"},
   146  		},
   147  		{
   148  			name: "ipset IPv6 sync, no updates required with /32 subnet",
   149  			set: &utilipset.IPSet{
   150  				Name: "zar",
   151  			},
   152  			setType:         utilipset.HashIPPortNet,
   153  			ipv6:            true,
   154  			activeEntries:   []string{"FE80::8329,tcp:8800,2001:db8::/32"},
   155  			currentEntries:  []string{"FE80::8329,tcp:8800,2001:db8::/32"},
   156  			expectedEntries: []string{"FE80::8329,tcp:8800,2001:db8::/32"},
   157  		},
   158  		{
   159  			name: "ipset IPv6 sync, current entries removed",
   160  			set: &utilipset.IPSet{
   161  				Name: "bbb",
   162  			},
   163  			setType:         utilipset.HashIPPortNet,
   164  			ipv6:            true,
   165  			activeEntries:   nil,
   166  			currentEntries:  []string{"FE80::8329,udp:8801,2001:db8::/32"},
   167  			expectedEntries: nil,
   168  		},
   169  		{
   170  			name: "ipset sync, port entry removed",
   171  			set: &utilipset.IPSet{
   172  				Name: "AAA",
   173  			},
   174  			setType:         utilipset.BitmapPort,
   175  			activeEntries:   nil,
   176  			currentEntries:  []string{"80"},
   177  			expectedEntries: nil,
   178  		},
   179  		{
   180  			name: "ipset sync, remove old and add new",
   181  			set: &utilipset.IPSet{
   182  				Name: "c-c-c",
   183  			},
   184  			setType:         utilipset.BitmapPort,
   185  			activeEntries:   []string{"8080", "9090"},
   186  			currentEntries:  []string{"80"},
   187  			expectedEntries: []string{"8080", "9090"},
   188  		},
   189  		{
   190  			name: "ipset sync, remove many stale ports",
   191  			set: &utilipset.IPSet{
   192  				Name: "NODE-PORT",
   193  			},
   194  			setType:         utilipset.BitmapPort,
   195  			activeEntries:   []string{"8080"},
   196  			currentEntries:  []string{"80", "9090", "8081", "8082"},
   197  			expectedEntries: []string{"8080"},
   198  		},
   199  		{
   200  			name: "ipset sync, add sctp entry",
   201  			set: &utilipset.IPSet{
   202  				Name: "sctp-1",
   203  			},
   204  			setType:         utilipset.HashIPPort,
   205  			ipv6:            false,
   206  			activeEntries:   []string{"172.17.0.4,sctp:80"},
   207  			currentEntries:  nil,
   208  			expectedEntries: []string{"172.17.0.4,sctp:80"},
   209  		},
   210  		{
   211  			name: "ipset sync, add IPV6 sctp entry",
   212  			set: &utilipset.IPSet{
   213  				Name: "sctp-2",
   214  			},
   215  			setType:         utilipset.HashIPPort,
   216  			ipv6:            true,
   217  			activeEntries:   []string{"FE80::0202:B3FF:FE1E:8329,sctp:80"},
   218  			currentEntries:  []string{"FE80::0202:B3FF:FE1E:8329,sctp:80"},
   219  			expectedEntries: []string{"FE80::0202:B3FF:FE1E:8329,sctp:80"},
   220  		},
   221  	}
   222  
   223  	for _, testCase := range testCases {
   224  		t.Run(testCase.name, func(t *testing.T) {
   225  			set := NewIPSet(fakeipset.NewFake(testIPSetVersion), testCase.set.Name, testCase.setType, testCase.ipv6, "comment-"+testCase.set.Name)
   226  
   227  			if err := set.handle.CreateSet(&set.IPSet, true); err != nil {
   228  				t.Errorf("Unexpected error: %v", err)
   229  			}
   230  
   231  			for _, entry := range testCase.currentEntries {
   232  				set.handle.AddEntry(entry, testCase.set, true)
   233  			}
   234  
   235  			set.activeEntries.Insert(testCase.activeEntries...)
   236  			set.syncIPSetEntries()
   237  			for _, entry := range testCase.expectedEntries {
   238  				found, err := set.handle.TestEntry(entry, testCase.set.Name)
   239  				if err != nil {
   240  					t.Errorf("Unexpected error: %v", err)
   241  				}
   242  				if !found {
   243  					t.Errorf("Unexpected entry %q not found in set foo", entry)
   244  				}
   245  			}
   246  		})
   247  	}
   248  }
   249  

View as plain text