Skip to content

Commit 2b153e5

Browse files
authored
Merge pull request #180 from River-sh/fix_panic
fix the panic when the active endpoints of gateway is nil/empty
2 parents 214aa3a + d86de52 commit 2b153e5

File tree

3 files changed

+113
-8
lines changed

3 files changed

+113
-8
lines changed

pkg/proxyengine/proxyserver/interceptor.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,9 @@ func serveRequest(conn net.Conn, w http.ResponseWriter, r *http.Request) {
189189
ctx := r.Context()
190190
select {
191191
case <-stopCh:
192-
klog.Info("chunked request(%s) normally exit", r.URL.String())
192+
klog.Infof("chunked request(%s) normally exit", r.URL.String())
193193
case <-ctx.Done():
194-
klog.Info("chunked request(%s) to agent(%s) closed by cloud client, %v", r.URL.String(),
194+
klog.Infof("chunked request(%s) to agent(%s) closed by cloud client, %v", r.URL.String(),
195195
r.Header.Get(utils.RavenProxyHostHeaderKey), ctx.Err())
196196
conn.Close()
197197
}

pkg/proxyengine/proxyserver/manageheader.go

+16-6
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ func (h *headerManger) getAPIServerRequestDestAddress(r *http.Request) (name, ip
145145
}
146146
name, err = h.getGatewayNodeName(&node)
147147
if err != nil {
148-
return "", "", "", fmt.Errorf("gateway include node %s, has no active endpoints, error %s",
149-
node.Name, err.Error())
148+
return "", "", "", fmt.Errorf("can not find gateway node for node %s, error %s", node.Name, err.Error())
150149
}
151150
ip = getNodeIP(&node)
152151
if ip == "" {
@@ -180,8 +179,7 @@ func (h *headerManger) getNormalRequestDestAddress(r *http.Request) (name, ip, p
180179
}
181180
name, err = h.getGatewayNodeName(&node)
182181
if err != nil {
183-
return "", "", "", fmt.Errorf("gateway include node %s, has no active endpoints, error %s",
184-
node.Name, err.Error())
182+
return "", "", "", fmt.Errorf("can not find gateway node for node %s, error %s", node.Name, err.Error())
185183
}
186184
ip = getNodeIP(&node)
187185
if ip == "" {
@@ -241,6 +239,18 @@ func (h *headerManger) getGatewayNodeName(node *v1.Node) (string, error) {
241239
}
242240
return "", err
243241
}
244-
rand.Seed(time.Now().Unix())
245-
return gw.Status.ActiveEndpoints[rand.Intn(len(gw.Status.ActiveEndpoints))].NodeName, nil
242+
if gw.Status.ActiveEndpoints == nil {
243+
return "", fmt.Errorf("no active endpoints for gw %s", gwName)
244+
}
245+
names := make([]string, 0)
246+
for _, ep := range gw.Status.ActiveEndpoints {
247+
if ep.Type == v1beta1.Proxy {
248+
names = append(names, ep.NodeName)
249+
}
250+
}
251+
if len(names) == 0 {
252+
return "", fmt.Errorf("no active endpoints for gw %s", gwName)
253+
}
254+
rand.New(rand.NewSource(time.Now().Unix()))
255+
return names[rand.Intn(len(names))], nil
246256
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package proxyserver
2+
3+
import (
4+
"testing"
5+
6+
v1 "k8s.io/api/core/v1"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
"k8s.io/apimachinery/pkg/runtime"
9+
"sigs.k8s.io/controller-runtime/pkg/client"
10+
"sigs.k8s.io/controller-runtime/pkg/client/fake"
11+
12+
"github.com/openyurtio/api/raven"
13+
"github.com/openyurtio/api/raven/v1beta1"
14+
)
15+
16+
func NewFakeClient(objs ...runtime.Object) client.Client {
17+
scheme := runtime.NewScheme()
18+
_ = v1.AddToScheme(scheme)
19+
_ = v1beta1.AddToScheme(scheme)
20+
return fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objs...).Build()
21+
}
22+
23+
var node1 = &v1.Node{
24+
ObjectMeta: metav1.ObjectMeta{
25+
Name: "node1",
26+
Labels: map[string]string{
27+
raven.LabelCurrentGateway: "gw-fake",
28+
},
29+
},
30+
}
31+
32+
var node2 = &v1.Node{
33+
ObjectMeta: metav1.ObjectMeta{
34+
Name: "node2",
35+
Labels: map[string]string{
36+
raven.LabelCurrentGateway: "gw-fake",
37+
},
38+
},
39+
}
40+
41+
var gw = &v1beta1.Gateway{
42+
ObjectMeta: metav1.ObjectMeta{
43+
Name: "gw-fake",
44+
},
45+
Spec: v1beta1.GatewaySpec{
46+
NodeSelector: &metav1.LabelSelector{
47+
MatchLabels: map[string]string{
48+
raven.LabelCurrentGateway: "gw-fake",
49+
},
50+
},
51+
Endpoints: []v1beta1.Endpoint{
52+
{
53+
NodeName: "node1",
54+
},
55+
{
56+
NodeName: "node2",
57+
},
58+
},
59+
},
60+
Status: v1beta1.GatewayStatus{
61+
Nodes: []v1beta1.NodeInfo{
62+
{
63+
NodeName: "node1",
64+
},
65+
{
66+
NodeName: "node2",
67+
},
68+
},
69+
ActiveEndpoints: []*v1beta1.Endpoint{
70+
{
71+
NodeName: "node1",
72+
Type: v1beta1.Proxy,
73+
},
74+
{
75+
NodeName: "node1",
76+
Type: v1beta1.Tunnel,
77+
},
78+
},
79+
},
80+
}
81+
82+
func Test_GetGatewayNodeName(t *testing.T) {
83+
hm := &headerManger{
84+
client: NewFakeClient(node1, node2, gw),
85+
gatewayName: "gw-fake",
86+
isIPv4: true,
87+
}
88+
result, err := hm.getGatewayNodeName(node1)
89+
if err != nil {
90+
t.Errorf("get gateway node name failed: %v", err)
91+
}
92+
if node1.Name != result {
93+
t.Errorf("get gateway node name failed: %v", err)
94+
}
95+
}

0 commit comments

Comments
 (0)