Skip to content

Commit f4d1674

Browse files
darshanimeliggitt
authored andcommitted
Refactor parsing logic for service IP and ranges, add tests
Signed-off-by: darshanime <[email protected]>
1 parent fdd25ec commit f4d1674

File tree

3 files changed

+112
-41
lines changed

3 files changed

+112
-41
lines changed

cmd/kube-apiserver/app/BUILD

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load("@io_bazel_rules_go//go:def.bzl", "go_library")
1+
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
22

33
go_library(
44
name = "go_default_library",
@@ -99,3 +99,9 @@ filegroup(
9999
tags = ["automanaged"],
100100
visibility = ["//visibility:public"],
101101
)
102+
103+
go_test(
104+
name = "go_default_test",
105+
srcs = ["server_test.go"],
106+
embed = [":go_default_library"],
107+
)

cmd/kube-apiserver/app/server.go

Lines changed: 49 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -572,47 +572,12 @@ func Complete(s *options.ServerRunOptions) (completedServerRunOptions, error) {
572572

573573
// process s.ServiceClusterIPRange from list to Primary and Secondary
574574
// we process secondary only if provided by user
575-
serviceClusterIPRangeList := []string{}
576-
if s.ServiceClusterIPRanges != "" {
577-
serviceClusterIPRangeList = strings.Split(s.ServiceClusterIPRanges, ",")
578-
}
579-
580-
var apiServerServiceIP net.IP
581-
var serviceIPRange net.IPNet
582-
var err error
583-
// nothing provided by user, use default range (only applies to the Primary)
584-
if len(serviceClusterIPRangeList) == 0 {
585-
var primaryServiceClusterCIDR net.IPNet
586-
serviceIPRange, apiServerServiceIP, err = master.ServiceIPRange(primaryServiceClusterCIDR)
587-
if err != nil {
588-
return options, fmt.Errorf("error determining service IP ranges: %v", err)
589-
}
590-
s.PrimaryServiceClusterIPRange = serviceIPRange
591-
}
592-
593-
if len(serviceClusterIPRangeList) > 0 {
594-
_, primaryServiceClusterCIDR, err := net.ParseCIDR(serviceClusterIPRangeList[0])
595-
if err != nil {
596-
return options, fmt.Errorf("service-cluster-ip-range[0] is not a valid cidr")
597-
}
598-
599-
serviceIPRange, apiServerServiceIP, err = master.ServiceIPRange(*(primaryServiceClusterCIDR))
600-
if err != nil {
601-
return options, fmt.Errorf("error determining service IP ranges for primary service cidr: %v", err)
602-
}
603-
s.PrimaryServiceClusterIPRange = serviceIPRange
604-
}
605-
606-
// user provided at least two entries
607-
if len(serviceClusterIPRangeList) > 1 {
608-
_, secondaryServiceClusterCIDR, err := net.ParseCIDR(serviceClusterIPRangeList[1])
609-
if err != nil {
610-
return options, fmt.Errorf("service-cluster-ip-range[1] is not an ip net")
611-
}
612-
613-
s.SecondaryServiceClusterIPRange = *(secondaryServiceClusterCIDR)
575+
apiServerServiceIP, primaryServiceIPRange, secondaryServiceIPRange, err := getServiceIPAndRanges(s.ServiceClusterIPRanges)
576+
if err != nil {
577+
return options, err
614578
}
615-
//note: validation asserts that the list is max of two dual stack entries
579+
s.PrimaryServiceClusterIPRange = primaryServiceIPRange
580+
s.SecondaryServiceClusterIPRange = secondaryServiceIPRange
616581

617582
if err := s.SecureServing.MaybeDefaultWithSelfSignedCerts(s.GenericServerRunOptions.AdvertiseAddress.String(), []string{"kubernetes.default.svc", "kubernetes.default", "kubernetes"}, []net.IP{apiServerServiceIP}); err != nil {
618583
return options, fmt.Errorf("error creating self-signed certificates: %v", err)
@@ -718,3 +683,47 @@ func buildServiceResolver(enabledAggregatorRouting bool, hostname string, inform
718683
}
719684
return serviceResolver
720685
}
686+
687+
func getServiceIPAndRanges(serviceClusterIPRanges string) (net.IP, net.IPNet, net.IPNet, error) {
688+
serviceClusterIPRangeList := []string{}
689+
if serviceClusterIPRanges != "" {
690+
serviceClusterIPRangeList = strings.Split(serviceClusterIPRanges, ",")
691+
}
692+
693+
var apiServerServiceIP net.IP
694+
var primaryServiceIPRange net.IPNet
695+
var secondaryServiceIPRange net.IPNet
696+
var err error
697+
// nothing provided by user, use default range (only applies to the Primary)
698+
if len(serviceClusterIPRangeList) == 0 {
699+
var primaryServiceClusterCIDR net.IPNet
700+
primaryServiceIPRange, apiServerServiceIP, err = master.ServiceIPRange(primaryServiceClusterCIDR)
701+
if err != nil {
702+
return net.IP{}, net.IPNet{}, net.IPNet{}, fmt.Errorf("error determining service IP ranges: %v", err)
703+
}
704+
return apiServerServiceIP, primaryServiceIPRange, net.IPNet{}, nil
705+
}
706+
707+
if len(serviceClusterIPRangeList) > 0 {
708+
_, primaryServiceClusterCIDR, err := net.ParseCIDR(serviceClusterIPRangeList[0])
709+
if err != nil {
710+
return net.IP{}, net.IPNet{}, net.IPNet{}, fmt.Errorf("service-cluster-ip-range[0] is not a valid cidr")
711+
}
712+
713+
primaryServiceIPRange, apiServerServiceIP, err = master.ServiceIPRange(*(primaryServiceClusterCIDR))
714+
if err != nil {
715+
return net.IP{}, net.IPNet{}, net.IPNet{}, fmt.Errorf("error determining service IP ranges for primary service cidr: %v", err)
716+
}
717+
}
718+
719+
// user provided at least two entries
720+
// note: validation asserts that the list is max of two dual stack entries
721+
if len(serviceClusterIPRangeList) > 1 {
722+
_, secondaryServiceClusterCIDR, err := net.ParseCIDR(serviceClusterIPRangeList[1])
723+
if err != nil {
724+
return net.IP{}, net.IPNet{}, net.IPNet{}, fmt.Errorf("service-cluster-ip-range[1] is not an ip net")
725+
}
726+
secondaryServiceIPRange = *secondaryServiceClusterCIDR
727+
}
728+
return apiServerServiceIP, primaryServiceIPRange, secondaryServiceIPRange, nil
729+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
Copyright 2019 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 app
18+
19+
import (
20+
"testing"
21+
)
22+
23+
func TestGetServiceIPAndRanges(t *testing.T) {
24+
tests := []struct {
25+
body string
26+
apiServerServiceIP string
27+
primaryServiceIPRange string
28+
secondaryServiceIPRange string
29+
expectedError bool
30+
}{
31+
{"", "10.0.0.1", "10.0.0.0/24", "<nil>", false},
32+
{"192.0.2.1/24", "192.0.2.1", "192.0.2.0/24", "<nil>", false},
33+
{"192.0.2.1/24,192.168.128.0/17", "192.0.2.1", "192.0.2.0/24", "192.168.128.0/17", false},
34+
{"192.0.2.1/30,192.168.128.0/17", "<nil>", "<nil>", "<nil>", true},
35+
}
36+
37+
for _, test := range tests {
38+
apiServerServiceIP, primaryServiceIPRange, secondaryServiceIPRange, err := getServiceIPAndRanges(test.body)
39+
40+
if apiServerServiceIP.String() != test.apiServerServiceIP {
41+
t.Errorf("expected apiServerServiceIP: %s, got: %s", test.apiServerServiceIP, apiServerServiceIP.String())
42+
}
43+
44+
if primaryServiceIPRange.String() != test.primaryServiceIPRange {
45+
t.Errorf("expected primaryServiceIPRange: %s, got: %s", test.primaryServiceIPRange, primaryServiceIPRange.String())
46+
}
47+
48+
if secondaryServiceIPRange.String() != test.secondaryServiceIPRange {
49+
t.Errorf("expected secondaryServiceIPRange: %s, got: %s", test.secondaryServiceIPRange, secondaryServiceIPRange.String())
50+
}
51+
52+
if (err == nil) == test.expectedError {
53+
t.Errorf("expected err to be: %t, but it was %t", test.expectedError, !test.expectedError)
54+
}
55+
}
56+
}

0 commit comments

Comments
 (0)