From 6ee8e161023ec797064144cf9e684a058a2e9b32 Mon Sep 17 00:00:00 2001 From: "CTFang@WireLab" Date: Tue, 6 Aug 2024 06:31:18 +0000 Subject: [PATCH 1/2] fix: allow empty sd in nf discovery --- go.mod | 3 + internal/sbi/processor/nf_discovery.go | 93 ++++++++++---------------- internal/util/convert.go | 35 ++++++++++ internal/util/convert_test.go | 64 ++++++++++++++++++ 4 files changed, 137 insertions(+), 58 deletions(-) create mode 100644 internal/util/convert.go create mode 100644 internal/util/convert_test.go diff --git a/go.mod b/go.mod index c000c3e..b197976 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/mitchellh/mapstructure v1.4.2 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.8.1 + github.com/stretchr/testify v1.8.3 github.com/urfave/cli v1.22.5 go.mongodb.org/mongo-driver v1.8.4 gopkg.in/yaml.v2 v2.4.0 @@ -22,6 +23,7 @@ require ( github.com/bytedance/sonic v1.9.1 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/evanphx/json-patch v0.5.2 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect @@ -41,6 +43,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/tim-ywliu/nested-logrus-formatter v1.3.2 // indirect diff --git a/internal/sbi/processor/nf_discovery.go b/internal/sbi/processor/nf_discovery.go index 6f14c56..e95716c 100644 --- a/internal/sbi/processor/nf_discovery.go +++ b/internal/sbi/processor/nf_discovery.go @@ -339,36 +339,11 @@ func buildFilter(queryParameters url.Values) bson.M { // Pattern: '^[A-Fa-f0-9]{6}$' if queryParameters["snssais"] != nil { snssais := queryParameters["snssais"][0] - snssaisSplit := strings.Split(snssais, ",") - var snssaisBsonArray bson.A - - var tempSnssai string - for i, v := range snssaisSplit { - if i%2 == 0 { - tempSnssai = v - } else { - tempSnssai += "," - tempSnssai += v - snssaiStruct := &models.Snssai{} - err := json.Unmarshal([]byte(tempSnssai), snssaiStruct) - if err != nil { - logger.DiscLog.Warnln("Unmarshal Error in snssaiStruct", err) - } - - snssaiByteArray, err := bson.Marshal(snssaiStruct) - if err != nil { - logger.DiscLog.Warnln("Unmarshal Error in snssaiStruct", err) - } - - snssaiBsonM := bson.M{} - err = bson.Unmarshal(snssaiByteArray, &snssaiBsonM) - if err != nil { - logger.DiscLog.Warnln("Unmarshal Error in snssaiBsonM", err) - } - - snssaisBsonArray = append(snssaisBsonArray, bson.M{"sNssais": bson.M{"$elemMatch": snssaiBsonM}}) - } + var snssaisBsonArray bson.A + slices := util.SnssaisToBsonM(snssais) + for _, slice := range slices { + snssaisBsonArray = append(snssaisBsonArray, bson.M{"sNssais": bson.M{"$elemMatch": slice}}) } // if not assign, serve all NF @@ -1451,37 +1426,39 @@ func complexQueryFilterSubprocess(queryParameters map[string]*AtomElem, complexQ // Pattern: '^[A-Fa-f0-9]{6}$' if queryParameters["snssais"] != nil { snssais := queryParameters["snssais"].value - snssaisSplit := strings.Split(snssais, ",") + // snssaisSplit := strings.Split(snssais, ",") var snssaisBsonArray bson.A - var tempSnssai string - for i, v := range snssaisSplit { - if i%2 == 0 { - tempSnssai = v - } else { - tempSnssai += "," - tempSnssai += v - - snssaiStruct := &models.Snssai{} - err := json.Unmarshal([]byte(tempSnssai), snssaiStruct) - if err != nil { - logger.DiscLog.Warnln("Unmarshal Error in snssaiStruct: ", err) - } - - snssaiByteArray, err := bson.Marshal(snssaiStruct) - if err != nil { - logger.DiscLog.Warnln("Unmarshal Error in snssaiByteArray: ", err) - } - - snssaiBsonM := bson.M{} - err = bson.Unmarshal(snssaiByteArray, &snssaiBsonM) - if err != nil { - logger.DiscLog.Warnln("Unmarshal Error in snssaiBsonM: ", err) - } - - snssaisBsonArray = append(snssaisBsonArray, snssaiBsonM) - } - } + // var tempSnssai string + // for i, v := range snssaisSplit { + // if i%2 == 0 { + // tempSnssai = v + // } else { + // tempSnssai += "," + // tempSnssai += v + + // snssaiStruct := &models.Snssai{} + // err := json.Unmarshal([]byte(tempSnssai), snssaiStruct) + // if err != nil { + // logger.DiscLog.Warnln("Unmarshal Error in snssaiStruct: ", err) + // } + + // snssaiByteArray, err := bson.Marshal(snssaiStruct) + // if err != nil { + // logger.DiscLog.Warnln("Unmarshal Error in snssaiByteArray: ", err) + // } + + // snssaiBsonM := bson.M{} + // err = bson.Unmarshal(snssaiByteArray, &snssaiBsonM) + // if err != nil { + // logger.DiscLog.Warnln("Unmarshal Error in snssaiBsonM: ", err) + // } + + // snssaisBsonArray = append(snssaisBsonArray, snssaiBsonM) + // } + // } + + snssaisBsonArray = append(snssaisBsonArray, util.SnssaisToBsonM(snssais)) snssaisFilter := bson.M{ "snssais": bson.M{ diff --git a/internal/util/convert.go b/internal/util/convert.go new file mode 100644 index 0000000..32e3e52 --- /dev/null +++ b/internal/util/convert.go @@ -0,0 +1,35 @@ +package util + +import ( + "encoding/json" + "strings" + + "go.mongodb.org/mongo-driver/bson" + + "github.com/free5gc/openapi/models" +) + +func SnssaisToBsonM(snssais string) []bson.M { + snssaisString := strings.Trim(snssais, "{}") + slicesStrings := strings.Split(snssaisString, "},{") + + var bsonMArray []bson.M + for _, slice := range slicesStrings { + slice = "{" + slice + "}" + + snssaiStruct := &models.Snssai{} + err := json.Unmarshal([]byte(slice), snssaiStruct) + if err != nil { + return nil + } + + snssaiBsonM := bson.M{} + snssaiBsonM["sst"] = snssaiStruct.Sst + if snssaiStruct.Sd != "" { + snssaiBsonM["sd"] = snssaiStruct.Sd + } + + bsonMArray = append(bsonMArray, snssaiBsonM) + } + return bsonMArray +} diff --git a/internal/util/convert_test.go b/internal/util/convert_test.go new file mode 100644 index 0000000..41d999b --- /dev/null +++ b/internal/util/convert_test.go @@ -0,0 +1,64 @@ +package util_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + + "github.com/free5gc/nrf/internal/util" +) + +// type Snssai struct { +// Sst int32 `json:"sst" yaml:"sst" bson:"sst" mapstructure:"Sst"` +// Sd string `json:"sd,omitempty" yaml:"sd" bson:"sd" mapstructure:"Sd"` +// } + +func TestSnssaisToBsonM(t *testing.T) { + testCases := []struct { + Name string + snssais string + expectBsonM []bson.M + }{ + { + Name: "Default 01010203", + snssais: "{\"sst\":1,\"sd\":\"010203\"}", + expectBsonM: []bson.M{ + { + "sst": int32(1), + "sd": "010203", + }, + }, + }, + { + Name: "Empty SD", + snssais: "{\"sst\":1}", + expectBsonM: []bson.M{ + { + "sst": int32(1), + }, + }, + }, + { + Name: "Two Slices", + snssais: "{\"sst\":1,\"sd\":\"010203\"},{\"sst\":1,\"sd\":\"112233\"}", + expectBsonM: []bson.M{ + { + "sst": int32(1), + "sd": "010203", + }, + { + "sst": int32(1), + "sd": "112233", + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + output := util.SnssaisToBsonM(tc.snssais) + require.Equal(t, tc.expectBsonM, output) + }) + } +} From 16e859af904d77e3428944a2ed8c8db4c2c1ec11 Mon Sep 17 00:00:00 2001 From: "CTFang@WireLab" Date: Thu, 8 Aug 2024 07:15:47 +0000 Subject: [PATCH 2/2] fix: remove unused code --- internal/sbi/processor/nf_discovery.go | 37 ++++---------------------- internal/util/convert_test.go | 5 ---- 2 files changed, 5 insertions(+), 37 deletions(-) diff --git a/internal/sbi/processor/nf_discovery.go b/internal/sbi/processor/nf_discovery.go index e95716c..2524077 100644 --- a/internal/sbi/processor/nf_discovery.go +++ b/internal/sbi/processor/nf_discovery.go @@ -1426,39 +1426,12 @@ func complexQueryFilterSubprocess(queryParameters map[string]*AtomElem, complexQ // Pattern: '^[A-Fa-f0-9]{6}$' if queryParameters["snssais"] != nil { snssais := queryParameters["snssais"].value - // snssaisSplit := strings.Split(snssais, ",") - var snssaisBsonArray bson.A - // var tempSnssai string - // for i, v := range snssaisSplit { - // if i%2 == 0 { - // tempSnssai = v - // } else { - // tempSnssai += "," - // tempSnssai += v - - // snssaiStruct := &models.Snssai{} - // err := json.Unmarshal([]byte(tempSnssai), snssaiStruct) - // if err != nil { - // logger.DiscLog.Warnln("Unmarshal Error in snssaiStruct: ", err) - // } - - // snssaiByteArray, err := bson.Marshal(snssaiStruct) - // if err != nil { - // logger.DiscLog.Warnln("Unmarshal Error in snssaiByteArray: ", err) - // } - - // snssaiBsonM := bson.M{} - // err = bson.Unmarshal(snssaiByteArray, &snssaiBsonM) - // if err != nil { - // logger.DiscLog.Warnln("Unmarshal Error in snssaiBsonM: ", err) - // } - - // snssaisBsonArray = append(snssaisBsonArray, snssaiBsonM) - // } - // } - - snssaisBsonArray = append(snssaisBsonArray, util.SnssaisToBsonM(snssais)) + var snssaisBsonArray bson.A + slices := util.SnssaisToBsonM(snssais) + for _, slice := range slices { + snssaisBsonArray = append(snssaisBsonArray, bson.M{"sNssais": bson.M{"$elemMatch": slice}}) + } snssaisFilter := bson.M{ "snssais": bson.M{ diff --git a/internal/util/convert_test.go b/internal/util/convert_test.go index 41d999b..ec4bacd 100644 --- a/internal/util/convert_test.go +++ b/internal/util/convert_test.go @@ -9,11 +9,6 @@ import ( "github.com/free5gc/nrf/internal/util" ) -// type Snssai struct { -// Sst int32 `json:"sst" yaml:"sst" bson:"sst" mapstructure:"Sst"` -// Sd string `json:"sd,omitempty" yaml:"sd" bson:"sd" mapstructure:"Sd"` -// } - func TestSnssaisToBsonM(t *testing.T) { testCases := []struct { Name string