diff --git a/pkg/velaql/providers/query/endpoint.go b/pkg/velaql/providers/query/endpoint.go index 8a08e1236..6e1717ada 100644 --- a/pkg/velaql/providers/query/endpoint.go +++ b/pkg/velaql/providers/query/endpoint.go @@ -407,26 +407,10 @@ func selectorNodeIP(ctx context.Context, clusterName string, client client.Clien workerNodes = append(workerNodes, nodes.Items[i]) } } - if gatewayNode == nil && len(workerNodes) > 0 { - gatewayNode = &workerNodes[0] - } - if gatewayNode == nil { - gatewayNode = &nodes.Items[0] - } if gatewayNode != nil { - var addressMap = make(map[corev1.NodeAddressType]string) - for _, address := range gatewayNode.Status.Addresses { - addressMap[address.Type] = address.Address - } - // first get external ip - if ip, exist := addressMap[corev1.NodeExternalIP]; exist { - return ip - } - if ip, exist := addressMap[corev1.NodeInternalIP]; exist { - return ip - } + return selectGatewayIP([]corev1.Node{*gatewayNode}) } - return "" + return selectGatewayIP(workerNodes) } // judgeAppProtocol RFC-6335 and http://www.iana.org/assignments/service-names). @@ -444,3 +428,23 @@ func judgeAppProtocol(port int32) string { return "" } } + +// selectGatewayIP will choose one gateway IP from all nodes, it will pick up external IP first. If there isn't any, it will pick the first node's internal IP. +func selectGatewayIP(nodes []corev1.Node) string { + if len(nodes) == 0 { + return "" + } + var addressMaps = make([]map[corev1.NodeAddressType]string, 0) + for _, node := range nodes { + var addressMap = make(map[corev1.NodeAddressType]string) + for _, address := range node.Status.Addresses { + addressMap[address.Type] = address.Address + } + // first get external ip + if ip, exist := addressMap[corev1.NodeExternalIP]; exist { + return ip + } + addressMaps = append(addressMaps, addressMap) + } + return addressMaps[0][corev1.NodeInternalIP] +} diff --git a/pkg/velaql/providers/query/endpoint_test.go b/pkg/velaql/providers/query/endpoint_test.go index d0c664e8a..aa7dacba3 100644 --- a/pkg/velaql/providers/query/endpoint_test.go +++ b/pkg/velaql/providers/query/endpoint_test.go @@ -39,7 +39,7 @@ import ( querytypes "github.com/oam-dev/kubevela/pkg/velaql/providers/query/types" ) -var _ = Describe("Test Query Provider", func() { +var _ = Describe("Test query endpoints", func() { BeforeEach(func() { }) @@ -268,5 +268,50 @@ var _ = Describe("Test Query Provider", func() { } Expect(edps).Should(BeEquivalentTo(urls)) }) + + It("Test select gateway IP", func() { + node1 := corev1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node-with-external-ip", + }, + Status: corev1.NodeStatus{ + Addresses: []corev1.NodeAddress{ + {Type: corev1.NodeExternalIP, Address: "node1-external-ip"}, + {Type: corev1.NodeInternalIP, Address: "node1-internal-ip"}, + }, + }, + } + node2 := corev1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node-without-external-ip", + }, + Status: corev1.NodeStatus{ + Addresses: []corev1.NodeAddress{ + {Type: corev1.NodeInternalIP, Address: "node2-internal-ip"}, + }, + }, + } + testCases := []struct { + nodes []corev1.Node + wantIP string + }{ + { + nodes: []corev1.Node{node1, node2}, + wantIP: "node1-external-ip", + }, + { + nodes: []corev1.Node{node2}, + wantIP: "node2-internal-ip", + }, + { + nodes: []corev1.Node{}, + wantIP: "", + }, + } + for _, tc := range testCases { + gotIP := selectGatewayIP(tc.nodes) + Expect(gotIP).Should(BeEquivalentTo(tc.wantIP)) + } + }) }) })