Skip to content

Commit 3d46595

Browse files
authored
Merge pull request kosmos-io#699 from OrangeBao/main
feat: format ipv6 address for service-cluster-ip-range
2 parents 68d7df8 + b7a75c4 commit 3d46595

File tree

6 files changed

+225
-2
lines changed

6 files changed

+225
-2
lines changed

pkg/clusterlink/agent-manager/agent_controller.go

+23-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package agent
22

33
import (
44
"context"
5+
"fmt"
56
"time"
67

78
apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -21,6 +22,7 @@ import (
2122
"github.com/kosmos.io/kosmos/pkg/clusterlink/controllers/node"
2223
"github.com/kosmos.io/kosmos/pkg/clusterlink/network"
2324
kosmosv1alpha1lister "github.com/kosmos.io/kosmos/pkg/generated/listers/kosmos/v1alpha1"
25+
"github.com/kosmos.io/kosmos/pkg/utils"
2426
)
2527

2628
const (
@@ -93,6 +95,20 @@ func (r *Reconciler) logResult(nodeConfigSyncStatus networkmanager.NodeConfigSyn
9395
}
9496
}
9597

98+
func formatNodeConfig(nodeConfig *kosmosv1alpha1.NodeConfig) (*kosmosv1alpha1.NodeConfig, error) {
99+
nodeConfigCopy := nodeConfig.DeepCopy()
100+
101+
for i, route := range nodeConfigCopy.Spec.Routes {
102+
ipNetStr, err := utils.FormatCIDR(route.CIDR)
103+
if err != nil {
104+
return nil, fmt.Errorf("failed to format nodeconfig route cidr, err: %s", err.Error())
105+
}
106+
nodeConfigCopy.Spec.Routes[i].CIDR = ipNetStr
107+
}
108+
109+
return nodeConfigCopy, nil
110+
}
111+
96112
func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
97113
klog.Infof("============ agent starts to reconcile %s ============", request.NamespacedName)
98114

@@ -109,6 +125,12 @@ func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (
109125
return reconcile.Result{RequeueAfter: RequeueTime}, nil
110126
}
111127

128+
reconcileNodeCopy, err := formatNodeConfig(&reconcileNode)
129+
if err != nil {
130+
klog.Errorf("format nodeconfig %s error: %v", request.NamespacedName, err)
131+
return reconcile.Result{RequeueAfter: RequeueTime}, nil
132+
}
133+
112134
localCluster, err := r.ClusterLister.Get(r.ClusterName)
113135
if err != nil {
114136
klog.Errorf("could not get local cluster, clusterNode: %s, err: %v", r.NodeName, err)
@@ -118,7 +140,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (
118140
r.NetworkManager.UpdateConfig(localCluster)
119141

120142
r.DebounceFunc(func() {
121-
nodeConfigSyncStatus := r.NetworkManager.UpdateFromCRD(&reconcileNode)
143+
nodeConfigSyncStatus := r.NetworkManager.UpdateFromCRD(reconcileNodeCopy)
122144
r.logResult(nodeConfigSyncStatus)
123145
})
124146

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package agent
2+
3+
import (
4+
"testing"
5+
6+
kosmosv1alpha1 "github.com/kosmos.io/kosmos/pkg/apis/kosmos/v1alpha1"
7+
)
8+
9+
func TestFormatNodeConfig(t *testing.T) {
10+
tests := []struct {
11+
name string
12+
input *kosmosv1alpha1.NodeConfig
13+
want *kosmosv1alpha1.NodeConfig
14+
}{
15+
{
16+
name: "test ipv4 and ipv6",
17+
input: &kosmosv1alpha1.NodeConfig{
18+
Spec: kosmosv1alpha1.NodeConfigSpec{
19+
Routes: []kosmosv1alpha1.Route{
20+
{
21+
CIDR: "2409:8c2f:3800:0011::0a18:0000/114",
22+
},
23+
{
24+
CIDR: "10.237.6.0/18",
25+
},
26+
},
27+
},
28+
},
29+
want: &kosmosv1alpha1.NodeConfig{
30+
Spec: kosmosv1alpha1.NodeConfigSpec{
31+
Routes: []kosmosv1alpha1.Route{
32+
{
33+
CIDR: "2409:8c2f:3800:11::a18:0/114",
34+
},
35+
{
36+
CIDR: "10.237.0.0/18",
37+
},
38+
},
39+
},
40+
},
41+
},
42+
{
43+
name: "test ipv6",
44+
input: &kosmosv1alpha1.NodeConfig{
45+
Spec: kosmosv1alpha1.NodeConfigSpec{
46+
Routes: []kosmosv1alpha1.Route{
47+
{
48+
CIDR: "2409:8c2f:3800:0011::0a18:0000/114",
49+
},
50+
},
51+
},
52+
},
53+
want: &kosmosv1alpha1.NodeConfig{
54+
Spec: kosmosv1alpha1.NodeConfigSpec{
55+
Routes: []kosmosv1alpha1.Route{
56+
{
57+
CIDR: "2409:8c2f:3800:11::a18:0/114",
58+
},
59+
},
60+
},
61+
},
62+
},
63+
{
64+
name: "test ipv4",
65+
input: &kosmosv1alpha1.NodeConfig{
66+
Spec: kosmosv1alpha1.NodeConfigSpec{
67+
Routes: []kosmosv1alpha1.Route{
68+
{
69+
CIDR: "10.237.6.0/18",
70+
},
71+
},
72+
},
73+
},
74+
want: &kosmosv1alpha1.NodeConfig{
75+
Spec: kosmosv1alpha1.NodeConfigSpec{
76+
Routes: []kosmosv1alpha1.Route{
77+
{
78+
CIDR: "10.237.0.0/18",
79+
},
80+
},
81+
},
82+
},
83+
},
84+
}
85+
for _, tt := range tests {
86+
t.Run(tt.name, func(t *testing.T) {
87+
nodeconfig, err := formatNodeConfig(tt.input)
88+
89+
if err != nil {
90+
t.Errorf("formatNodeConfig() error = %v", err)
91+
}
92+
93+
if len(nodeconfig.Spec.Routes) != len(tt.want.Spec.Routes) {
94+
t.Errorf("formatNodeConfig() = %v, want %v", nodeconfig.Spec.Routes, tt.want.Spec.Routes)
95+
}
96+
97+
for i := range nodeconfig.Spec.Routes {
98+
if nodeconfig.Spec.Routes[i].CIDR != tt.want.Spec.Routes[i].CIDR {
99+
t.Errorf("formatNodeConfig() = %v, want %v", nodeconfig.Spec.Routes[i].CIDR, tt.want.Spec.Routes[i].CIDR)
100+
}
101+
}
102+
})
103+
}
104+
}

pkg/clusterlink/controllers/cluster/helper.go

+9
Original file line numberDiff line numberDiff line change
@@ -128,5 +128,14 @@ func ResolveServiceCIDRs(pod *corev1.Pod) ([]string, error) {
128128
}
129129
}
130130
}
131+
132+
for i, cidr := range serviceCIDRS {
133+
ipNetStr, err := utils.FormatCIDR(cidr)
134+
if err != nil {
135+
return nil, fmt.Errorf("failed to format service cidr %s, pod name is %s, err: %s", cidr, pod.Name, err.Error())
136+
}
137+
serviceCIDRS[i] = ipNetStr
138+
}
139+
131140
return serviceCIDRS, nil
132141
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package cluster
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
"testing"
7+
8+
corev1 "k8s.io/api/core/v1"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
)
11+
12+
func prepareData(crds string) *corev1.Pod {
13+
return &corev1.Pod{
14+
ObjectMeta: metav1.ObjectMeta{
15+
Name: "test-pod",
16+
Namespace: "test-namespace",
17+
Labels: map[string]string{
18+
"app": "test-app",
19+
},
20+
},
21+
Spec: corev1.PodSpec{
22+
Containers: []corev1.Container{
23+
{
24+
Name: "test-container",
25+
Image: "test-image",
26+
Command: []string{
27+
"kube-apiserver",
28+
fmt.Sprintf("--service-cluster-ip-range=%s", crds),
29+
"--profiling=false",
30+
},
31+
},
32+
},
33+
},
34+
}
35+
}
36+
37+
func TestResolveServiceCIDRs(t *testing.T) {
38+
tests := []struct {
39+
name string
40+
input *corev1.Pod
41+
want []string
42+
}{
43+
{
44+
name: "test ipv4 and ipv6",
45+
input: prepareData("2409:8c2f:3800:0011::0a18:0000/114,10.237.6.0/18"),
46+
want: []string{
47+
"2409:8c2f:3800:11::a18:0/114",
48+
"10.237.0.0/18",
49+
},
50+
},
51+
{
52+
name: "test ipv4",
53+
input: prepareData("10.237.6.0/18"),
54+
want: []string{
55+
"10.237.0.0/18",
56+
},
57+
},
58+
{
59+
name: "test ipv6",
60+
input: prepareData("2409:8c2f:3800:0011::0a18:0000/114"),
61+
want: []string{
62+
"2409:8c2f:3800:11::a18:0/114",
63+
},
64+
},
65+
}
66+
67+
for _, tt := range tests {
68+
t.Run(tt.name, func(t *testing.T) {
69+
ret, err := ResolveServiceCIDRs(tt.input)
70+
if err != nil {
71+
t.Fatalf("ResolveServiceCIDRs err: %s", err.Error())
72+
}
73+
74+
if strings.Join(ret, ",") != strings.Join(tt.want, ",") {
75+
t.Fatalf("value is incorretc!")
76+
}
77+
})
78+
}
79+
}

pkg/kubenest/controller/virtualcluster_init_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func (c *VirtualClusterInitController) Reconcile(ctx context.Context, request re
128128
}
129129

130130
switch originalCluster.Status.Phase {
131-
case "", v1alpha1.Pending:
131+
case "":
132132
//create request
133133
updatedCluster.Status.Phase = v1alpha1.Preparing
134134
err := c.Update(updatedCluster)

pkg/utils/utils.go

+9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package utils
22

33
import (
44
"fmt"
5+
"net"
56
"os"
67
"strings"
78

@@ -57,3 +58,11 @@ func IPFamilyGenerator(apiServerServiceSubnet string) []corev1.IPFamily {
5758
}
5859
return ipFamilies
5960
}
61+
62+
func FormatCIDR(cidr string) (string, error) {
63+
_, ipNet, err := net.ParseCIDR(cidr)
64+
if err != nil {
65+
return "", fmt.Errorf("failed to parse cidr %s, err: %s", cidr, err.Error())
66+
}
67+
return ipNet.String(), nil
68+
}

0 commit comments

Comments
 (0)