From 69ff7cede511457837ed93659b38804841bd7dc7 Mon Sep 17 00:00:00 2001 From: Riya Singhal Date: Fri, 15 Dec 2023 18:37:49 +0530 Subject: [PATCH] cephfs: fix fetchIP to support more formats Signed-off-by: Riya Singhal (cherry picked from commit bee77f7fac51a733063c59b0c635d62bc8d6b3a5) (cherry picked from commit 03087481e77817ef220ad2cdf492ef2eacd807b4) --- internal/csi-addons/networkfence/fencing.go | 24 +++++++++++++++---- .../csi-addons/networkfence/fencing_test.go | 5 ++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/internal/csi-addons/networkfence/fencing.go b/internal/csi-addons/networkfence/fencing.go index d8361e55c2b..5554a0cd33d 100644 --- a/internal/csi-addons/networkfence/fencing.go +++ b/internal/csi-addons/networkfence/fencing.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "net" + "regexp" "strconv" "strings" "time" @@ -210,11 +211,24 @@ func (ac *activeClient) fetchIP() (string, error) { // example: "inst": "client.4305 172.21.9.34:0/422650892", // then returning value will be 172.21.9.34 clientInfo := ac.Inst - parts := strings.Fields(clientInfo) - if len(parts) >= 2 { - lastColonIndex := strings.LastIndex(parts[1], ":") - firstPart := parts[1][:lastColonIndex] - ip := net.ParseIP(firstPart) + + // Attempt to extract the IP address using a regular expression + // the regular expression aims to match either a complete IPv6 + // address or a complete IPv4 address follows by any prefix (v1 or v2) + // if exists + // (?:v[0-9]+:): this allows for an optional prefix starting with "v" + // followed by one or more digits and a colon. + // The ? outside the group makes the entire prefix section optional. + // (?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}: this allows to check for + // standard IPv6 address. + // |: Alternation operator to allow matching either the IPv6 pattern + // with a prefix or the IPv4 pattern. + // '(?:\d+\.){3}\d+: This part matches a standard IPv4 address. + re := regexp.MustCompile(`(?:v[0-9]+:)?([0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7}|(?:\d+\.){3}\d+)`) + ipMatches := re.FindStringSubmatch(clientInfo) + + if len(ipMatches) > 0 { + ip := net.ParseIP(ipMatches[1]) if ip != nil { return ip.String(), nil } diff --git a/internal/csi-addons/networkfence/fencing_test.go b/internal/csi-addons/networkfence/fencing_test.go index 40242cf7907..26aab00f606 100644 --- a/internal/csi-addons/networkfence/fencing_test.go +++ b/internal/csi-addons/networkfence/fencing_test.go @@ -73,6 +73,11 @@ func TestFetchIP(t *testing.T) { expectedIP: "2001:db8:85a3::8a2e:370:7334", expectedErr: false, }, + { + clientInfo: "client.24152 v1:100.64.0.7:0/3658550259", + expectedIP: "100.64.0.7", + expectedErr: false, + }, { clientInfo: "", expectedIP: "",