Skip to content

Commit

Permalink
fix: allow empty sd in nf discovery
Browse files Browse the repository at this point in the history
  • Loading branch information
andy89923 committed Aug 6, 2024
1 parent 6ce2fab commit 6ee8e16
Show file tree
Hide file tree
Showing 4 changed files with 137 additions and 58 deletions.
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
93 changes: 35 additions & 58 deletions internal/sbi/processor/nf_discovery.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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{
Expand Down
35 changes: 35 additions & 0 deletions internal/util/convert.go
Original file line number Diff line number Diff line change
@@ -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
}
64 changes: 64 additions & 0 deletions internal/util/convert_test.go
Original file line number Diff line number Diff line change
@@ -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)
})
}
}

0 comments on commit 6ee8e16

Please sign in to comment.