Fix: vela status will always get external ip first (#5014)

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>

Signed-off-by: Qiaozp <qiaozhongpei.qzp@alibaba-inc.com>
This commit is contained in:
qiaozp
2022-11-07 17:54:54 +08:00
committed by GitHub
parent 853df82f4a
commit e79e12fbe6
2 changed files with 68 additions and 19 deletions

View File

@@ -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]
}

View File

@@ -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))
}
})
})
})